Qt 多线程的简单演示
任务:单击“”开始“”按钮将启动数个工作线程,线程由checkBox 来决定线程的启用或者关闭,各个线程循环打印数字,数字每秒累加1;单击“停止”按钮将终止所有线程。
关于Qt中线程的理解:
Qt中的QThread类提供了平台无关的线程。一个QThread代表了一个在应用程序中可以独立控制的线程,它与进程中的其他线程分享数据,而且是独立执行的。
多线程编程可以有效解决在不冻结一个应用程序的用户界面情况下执行一个耗时的操作问题。
相对于一般的程序都是从main()函数开始执行,QThread从run()函数开始执行。
QThread也提供了一个预平台五关的睡眠函数。
实现过程:
单独构造一个WorkThread 类
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include<QString>
#include<QThread>
#include<QObject>
class Workthread:public QThread
{
Q_OBJECT
public:
Workthread();
QString str;
protected:
void run();
signals:
void mysignal(int);
};
#endif // WORKTHREAD_H
#include "workthread.h"
#include<QDebug>
Workthread::Workthread()
{
}
void Workthread::run()
{
while(true)
{
for(int n = 0;n<1000;n++)
{
str = QString::number(n);
sleep(1);
emit(mysignal(n));
qDebug()<<str;
}
}
}
在workThread类中,定义了run() 来实现定时器累加。
接着在mianwindow.cpp 的构造函数中添加如下代码,这里将创建多个线程的对象。关联按钮来控制线程的开启和终止。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("线程");
for(int i = 0;i<MAXSIZE;i++)
{
workThread[i] = new Workthread();
connect(workThread[i],SIGNAL(mysignal(int)),this,SLOT(ShowMsg(int)));
}
for(int i = 0;i<5;i++)
{
flag_thread[i] = false;
}
connect(ui->pushButton_start,SIGNAL(clicked()),this, SLOT(slotStart()));
connect(ui->pushButton_stop,SIGNAL(clicked()),this, SLOT(slotStop()));
connect(ui->pushButton_exit,SIGNAL(clicked()),this, SLOT(close()));
}
接着:在信号槽函数中实现 线程的开启和终止
void MainWindow::slotStart()
{
for(int i = 0;i<5;i++)
{
if(flag_thread[i])
{
workThread[i]->start();
}
}
ui->pushButton_start->setEnabled(false);
ui->pushButton_stop->setEnabled(true);
}
void MainWindow::slotStop()
{
for(int i = 0;i<5;i++)
{
if(flag_thread[i])
{
workThread[i]->terminate();
workThread[i]->wait();
}
}
ui->pushButton_start->setEnabled(true);
ui->pushButton_stop->setEnabled(false);
}
我们用一个editText 部件来显示线程处理中的数值,ShowMsg()函数来接收线程传递过来的信号mysignal(int)
这里,我们关联
connect(workThread[i],SIGNAL(mysignal(int)),this,SLOT(ShowMsg(int)));
void MainWindow::ShowMsg(int i )
{
QString str = QString::number(i);
ui->textEdit->append(str);
}
这样就可以实现文本框的显示了。
最后,checkBox 部件的实现,我们让该部件来响应线程的开启和关闭、
void MainWindow::on_checkBox_1_clicked(bool checked)
{
if(checked)
{
flag_thread[0] = true;
workThread[0]->start();
}
else
{
flag_thread[0] = false;
workThread[0]->terminate();
workThread[0]->wait();
}
}
这样,关于Qt多线程的并发处理的简单例子就实现了,这里并没有涉及线程间控制的相关内容。
资源链接:
https://download.csdn.net/download/qq_21291397/12354483