网站等比例缩放设计,电商网站建设属于研发费用吗,房地产网页,应用市场1.QThread线程基础
QThread是Qt线程中有一个公共的抽象类#xff0c;所有的线程类都是从QThread抽象类中派生的#xff0c;需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run#xff08;#xff09;函数是线程体函数#xff0c;用于定义线程的功能…1.QThread线程基础
QThread是Qt线程中有一个公共的抽象类所有的线程类都是从QThread抽象类中派生的需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run函数是线程体函数用于定义线程的功能。 void start函数是启动函数用于将线程入口地址设置为run函数。 void terminate函数用于强制结束线程不保证数据完整性和资源释放。 QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用不能从一个QThread中调用。在GUI程序中主线程也称为GUI线程是唯一允许执行GUI相关操作的线程。另外必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。 当线程启动和结束时QThread会发送信号started()和finished()可以使用isFinished()和isRunning()来查询线程的状态。
从Qt4.8起可以释放运行刚刚结束的线程对象通过连接finished()信号到QObject::deleteLater()槽。 使用wait()来阻塞调用的线程直到其它线程执行完毕或者直到指定的时间过去。 静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回线程的ID后者返回一个线程指针。 要设置线程的名称可以在启动线程之前调用setObjectName()。如果不调用setObjectName()线程的名称将是线程对象的运行时类型QThread子类的类名。
应用程序的线程称为主线程额外创建的线程为工作线程。一般在主线程里面创建工作线程并调用 start() 开始执行工作线程的任务。start会在内部调用run函数进入工作线程的循环在 run() 函数里调用 exit() 或 quit() 可以结束线程的事件循环或在主线程里调用 terminate() 强制结束线程。 QThread类的主要接口类型函数功能 公共函数bool isFinished ()线程是否结束bool isRunning ()线程是否正在运行Priority priority ()返回线程的优先级void setPriority (Priority priority)设置线程的优先级void exit(int returnCode0)退出事件的循环退出码为returnCode 0表示成功否则表示有错误bool waitunsigned long time阻止线程执行直到线程结束从run函数返回或等待时间超过time毫秒公共槽函数void quit退出线程的事件循环并返回代码0等效于exitvoid startPriority priority内部调用run函数开始执行线程操作系统根据priority参数进行调度终止线程的运行但不是立即结束线程而是等待操作系统结束线程。使用terminate之后应使用waitvoid terminate() 信号void finished()在线程结束时发射此信号void start()在线程开始执行、run函数被调用之前发射此信号静态公共函数int idealThreadCount()返回系统上能运行的线程的理性个数void msleep(unsigned long msecs) 强制当前线程休眠msecs毫秒void sleep(unsigned long secs)强制当前线程休眠secs秒void usleep(unsigned long usecs) 强制当前线程休眠uecs微秒保护函数virtual void run()start()调用run函数开始线程任务的执行所以在run函数里实现线程的任务功能int exec()由run函数调用进入线程的时间循环等待exit退出
2.小案例
threaddlg.h
#ifndef THREADDLG_H
#define THREADDLG_H
#define MAXSIZE 5
#include workthread.h
#include QDialog
#include QPushButtonQT_BEGIN_NAMESPACE
namespace Ui { class Threaddlg; }
QT_END_NAMESPACEclass Threaddlg : public QDialog
{Q_OBJECTpublic:Threaddlg(QWidget *parent nullptr);~Threaddlg();private:Ui::Threaddlg *ui;QPushButton *startBtn;QPushButton *stopBtn;QPushButton *quitBtn;WorkThread *workThread[MAXSIZE];public slots:void slotStart();void slotStop();};
#endif // THREADDLG_Hthreaddlg.cpp
#include threaddlg.h
#include ui_threaddlg.h
#includeQHBoxLayout
Threaddlg::Threaddlg(QWidget *parent): QDialog(parent), ui(new Ui::Threaddlg)
{ui-setupUi(this);setWindowTitle(QStringLiteral(线程));startBtnnew QPushButton(QStringLiteral(线程));stopBtnnew QPushButton(QStringLiteral(停止));quitBtnnew QPushButton(QStringLiteral(退出));QHBoxLayout *mainLayoutnew QHBoxLayout(this);mainLayout-addWidget(startBtn);mainLayout-addWidget(stopBtn);mainLayout-addWidget(quitBtn);connect(startBtn,SIGNAL(clicked()),this,SLOT(slotStart()));connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStop()));connect(quitBtn,SIGNAL(clicked()),this,SLOT(close()));}Threaddlg::~Threaddlg()
{delete ui;
}void Threaddlg::slotStart()
{for(int i0;iMAXSIZE;i){workThread[i]new WorkThread; //创建指定数目的WorkThread线程并将其保存在指针数组workThread中}for(int i0;iMAXSIZE;i){workThread[i]-start();//调用QThread基类start函数此函数将启动run,使线程开始真正运行}startBtn-setEnabled(false);stopBtn-setEnabled(true);
}void Threaddlg::slotStop()
{for(int i0;iMAXSIZE;i){workThread[i]-terminate();//terminate函数不会立刻终止这个线程该线程何时终止取决于操作系统的调度策略workThread[i]-wait();//使线程阻塞等待直到退出或超时}startBtn-setEnabled(true);stopBtn-setEnabled(false);
}
WorkThread.h
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include QThread
#include QtDebug
class WorkThread : public QThread
{
public:WorkThread();protected:void run();
};#endif // WORKTHREAD_HWorkThread.cpp #include workthread.hWorkThread::WorkThread()
{}void WorkThread::run()
{while(true){for(int n0;n10;n)qDebug()nnnnnnn;}
}结果 1个线程 5个线程 可以看出一个线程输出是顺序打印的5个线程也就是多线程的输出结果是乱码打印的
犯了一个很低级的错误
报错为 原来是因为 对了就是clicked没有加括号