使用QObject实现多线程的步骤不多,自己想创建一个类,类中包含多个不同功能的函数,他们都需要在线程中执行,使用过程中发现当链接了第一槽函数后其他的槽函数就不会响应了。看了网上的很多教程,结合自己的想法和需求设计了这样的用法。下面是具体的使用方法。
/********线程类.h************/
class ClassName : public QObject
{
Q_OBJECT
public:
ClassName();
public slots:
void doWork1();
void doWork2();
void doWork3();
signals:
void finished();
void sendWork1(int i=1);//信号可以带参数,但是要和槽函数保持一致。
void sendWork2(int i=2);
void sendwork3(int i=3);
}
/**********线程类.cpp**************/
ClassName::ClassName()
{
}
void ClassName::doWork1()
{
while(1)
;//耗时处理1
//处理结束后
emit sendWork1();//如果需要,可以通过信号和其他线程通信
emit finished();
return ;
}
void ClassName::doWork2()
{
while(1)
;//耗时处理2
//处理结束后
emit sendWork2();
emit finished();
return ;
}
void ClassName::doWork3()
{
while(1)
;//耗时处理3
//处理结束后
emit sendWork3();
emit finished();
return ;
}
/***********需要开启线程的位置*****************/
//很多教程都将工作类设置成了成员变量使用,这里并没有定义成成员变量
//h
signals:
void senDoWork1();
void senDoWork2();
void senDoWork3();
public slots:
void onWork1Send(int i);
void onWork2Send(int i);
void onWork3Send(int i);
//cpp
void XXXX::sendDoWork1()
{
QThread* myThread = new QThread(this);
ClassName* myWork = new ClassName;//工作类
myWork->moveToThread(myThread);
connect(this,&XXXX::senDoWork1,myWork,&ClassName::doWork1);//链接需要在线程中调用的函数,就是刚刚定义的doWork1、2、3
auto finished = [=]()
{
qDebug()<<"线程结束";
myThread->quit();
myThread->wait();
};//匿名函数,为了关闭线程,因为这个工作类不是成员变量。如果定义成成员变量一个类只可以对应一个线程(只响应最先链接的那个槽函数)
connect(myWork,&ClassName::finished,this,finished);//链接线程结束信号
connect(myWork,&ClassName::sendWork1,this,&XXXX::onWork1Send);//链接线程中发送的信号
myThread->start();
emit senDoWork1();//发送信号,执行对应的函数,执行的函数是在新的进程中的。
}
void XXXX::onWork1Send(int i)
{
qDebug()<<i;
}
这样使用就可以实现使用一个类,通过不同的信号触发不同的槽函数,在不同的线程中执行需要的功能了。
主要就是避免使用成员变量。其他大部分相关文章都是把继承QObject的类和QThread类定义成成员变量。这里将他们都定义成为局部变量。最后附带一个测试的例子。
这个只是我自己的一点点理解,如果有误欢迎指正。
https://download.csdn.net/download/carrottttt/12532313