利用QT的QThread将一个类中的成员函数转到线程下执行

#include "displaythread.h"
#include "mainwindow.h"

DisplayThread::DisplayThread(MainWindow *pWindow, QObject *parent) :
    QThread(parent)
{
    m_pWindow = pWindow;
}

void DisplayThread::run()
{
    m_pWindow->display();
}

void MainWindow::on_pushButton_clicked()
{
    DisplayThread *pThread = new DisplayThread(this);
    pThread->start();
}

void MainWindow::display()
{
    ui->label->setPixmap(QPixmap(":/images/button.jpg"));
}
 

      在mainwindow类中创建一个Button,连接一个槽函数display,考虑到槽函数执行过程中别的功能的实现,将display移到新的线程下。DisneyThread继承了QThread并且将MainWindow类传入,重写线程的run()函数,在run()函数中调用display,这样就可以保证display执行的过程中,MainWindow的其他功能可以同时实现了。

     第一次写博文,还是参照sourire_will的代码,十分感谢。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Qt中,槽函数是由事件循环调用的,因此如果您想要利用多核处理来运行槽函数,可以考虑以下几种方式: 1. 使用QtConcurrent库:QtConcurrent库可以方便地将函数并行化,包括槽函数。您可以使用QtConcurrent::run()函数来将槽函数放到一个新的线程中运行,例如: ```cpp void MyClass::mySlot() { QtConcurrent::run(this, &MyClass::mySlotHelper); } void MyClass::mySlotHelper() { // 槽函数的实际代码 } ``` 2. 使用线程池:如果您需要在多个槽函数中共享线程池,可以使用QtQThreadPool来管理线程池。您可以将槽函数包装成QRunnable对象,并将其提交给线程池,例如: ```cpp void MyClass::mySlot() { MyRunnable *runnable = new MyRunnable(this); QThreadPool::globalInstance()->start(runnable); } class MyRunnable : public QRunnable { public: MyRunnable(MyClass *obj) : m_obj(obj) {} void run() override { m_obj->mySlotHelper(); } private: MyClass *m_obj; }; ``` 3. 使用Qt的信号槽机制:信号槽机制本身就支持多线程,您可以将槽函数放到一个QObject的子类中,将该对象移动到一个线程中,并将槽函数连接到其他对象的信号上,例如: ```cpp class MyObject : public QObject { Q_OBJECT public: MyObject(QObject *parent = nullptr) : QObject(parent) {} public slots: void mySlot() { /* 槽函数的实际代码 */ } }; MyObject *obj = new MyObject; QThread *thread = new QThread; obj->moveToThread(thread); connect(otherObj, &OtherObject::someSignal, obj, &MyObject::mySlot); thread->start(); ``` 需要注意的是,如果您使用了以上任何一种方法,都需要确保槽函数线程安全的,因为它可能被多个线程同时调用
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值