Qt继承QObject实现多线程

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,可以使用 QThread 类来实现多线程应用程序。要在多个线程之间传递消息,可以使用 Qt 的信号和槽机制。可以使用信号将消息发送到主线程的消息队列中,并使用槽来处理这些消息。 以下是实现多线程消息队列的一般步骤: 1. 创建一个继承QThread 的子类。 ```cpp class WorkerThread : public QThread { Q_OBJECT public: explicit WorkerThread(QObject *parent = nullptr); void run() override; signals: void message(const QString &text); }; ``` 2. 实现子类的 run() 函数,该函数将在新线程中运行。在 run() 函数中,可以使用信号来发送消息到主线程的消息队列中。 ```cpp void WorkerThread::run() { // 在这里执行一些耗时操作 // 发送消息到主线程的消息队列中 emit message("耗时操作完成!"); } ``` 3. 在主线程中创建 WorkerThread 实例,并连接其 message() 信号到槽函数。 ```cpp class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); public slots: void showMessage(const QString &text); private: Ui::MainWindow *ui; WorkerThread *workerThread; }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); workerThread = new WorkerThread(this); connect(workerThread, &WorkerThread::message, this, &MainWindow::showMessage); } void MainWindow::showMessage(const QString &text) { ui->statusBar->showMessage(text); } ``` 4. 启动 WorkerThread 线程。 ```cpp void MainWindow::on_startButton_clicked() { workerThread->start(); } ``` 当 WorkerThread 完成耗时操作时,将在主线程的消息队列中调用 showMessage() 槽函数,从而在应用程序的状态栏中显示消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值