Qt继承QObject实现多线程

2023-02-18 10:19:41

使用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

  • 作者:carrottttt
  • 原文链接:https://blog.csdn.net/carrottttt/article/details/106829468
    更新时间:2023-02-18 10:19:41