利用QThread类实现简单多线程案例循环打印数字0~9,直到单击“停止”按钮终止所有线程为止。
要创建一个线程,需要子类化QThread,并且重新实现run()函数。
新建一个Qt案例,项目名称为“ThreadTest”,基类选择“QDialog”,取消创建UI界面复选框的选中状态,完成项目创建。然后新建一个C++ class类,类名为workthread,继承自QThread类,如下图所示:
无UI界面
定义工作线程数目:
#define MAXSIZE 1 //工作线程数目由MAXSIZE决定
声明按钮变量和相应的槽函数:
#include"workthread.h"
#define MAXSIZE 1 //工作线程数目由MAXSIZE决定
public:
QPushButton *startBtn;
QPushButton *stopBtn;
QPushButton *quitBtn;
public slots :
void slotStart();//启动线程槽函数
void slotStop() ;//终止线程槽函数
private:
workthread *workThread[MAXSIZE];//指向工作线程workthread的私有指针数组,记录全部线程
在源文件的构造函数中,建立布局:
//建立布局
setWindowTitle(tr("线程")) ;
startBtn=new QPushButton(tr ("开始"));
stopBtn =new QPushButton(tr ("停止"));
quitBtn =new QPushButton(tr ("退出"));
QHBoxLayout *mainLayout = new 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()));
启动线程槽函数:
//启动线程
void Dialog::slotStart()
{
//创建MAXSIZE个线程,并将指针保存在workThread中
for(int i=0;i<MAXSIZE;i++)
{
workThread[i] =new workthread();
}
for(int i=0;i<MAXSIZE;i++)
{
workThread[i]->start() ;//调用QThread的start()函数,启动run()函数从而启动线程
}
startBtn->setEnabled(false);
stopBtn->setEnabled(true);
}
停止线程槽函数:
//停止线程
void Dialog::slotStop()
{
for(int i=0;i<MAXSIZE;i++)
{
workThread[i]->terminate();//终止线程
workThread[i]->wait();//线程阻塞
}
startBtn->setEnabled(true);
stopBtn->setEnabled (false);
}
【注意】:terminate()函数并不会立刻终止这个线程,该线程何时终止取决于操作系统的调度策略。因此,程序紧接着调用了QThread基类的wait()函数,它使线程阻塞等待直到退出或超时。
声明run()函数:
protected:
void run();
定义run函数:
//不断打印数字0-9,为了显示明显,将每个数字重复打印8次
void workthread::run()
{
while (true)
{
for(int n=0;n<10;n++)
qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
}
}
完整效果如下:其中左图是MAXSIZE=5(启动5个线程的运行结果),右图是MAXSIZE=1(启动1个线程的运行结果):
可以发现,单一线程的输出是顺序打印的,而多线程输出是乱序打印的,这也是多线程的一大特点:多线程的执行顺序无法保证,它与操作系统的调度策略和线程优先级等因素有关。
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/77638988
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~