QT 多线程(一)

Qt提供两种多线程方式。一种继承QThread类;另一种采用movetothread。在Qt中采用事件循环(QEvenLoop)处理时间。

一、继承QThread

Qt线程中默认run函数调用exec()执行事件循环。但是如果继承的run函数没有启动事件循环,run函数就不会阻塞。如果我们需要启动线程内的事件循环,就需要手动执行exec()。 
注意继承自QThread的类在子线程中只有run()函数部分能够在子线程中运行。其他部分还是在主线程中运行。

#include <QtCore>

class Thread : public QThread
{
private:
    void run()
    {
        qDebug()<<"From worker thread: "<<currentThreadId();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"From main thread: "<<QThread::currentThreadId();

    Thread t;
    QObject::connect(&t, SIGNAL(finished()), &a, SLOT(quit()));

    t.start();
    return a.exec();
}

如果run函数没有启用事件循环,那么一般情况下我们通过设置flag来结束进程。启用事件循环exec()后,线程不断做着循环遍历事件队列的工作,调用QThread的quit()或exit()方法使停止线程,尽量不要使用terminate(),会造成资源不能释放,甚至互斥锁还处于加锁状态。其中quit与terminate是槽,可以直接用信号连接关闭线程。线程被终止时,所有等待该线程Finished的线程都将被唤醒。

#include "QThread"
#include "QMutexLocker"
#include "QMutex"
class Thread:public QThread
{
    Q_OBJECT
public:
    Thread();
    void stop();
private:
    bool m_stopFlag;
    QMutex mutex;
protected:
    void run();
};
Thread::Thread()
{
    m_stopFlag = false;
}

void Thread::stop()
{
    QMutexLocker locker(&mutex);
    m_stopFlag = true;
}

void Thread::run()
{
    while(1){
        {
            QMutexLocker locker(&mutex);
            if(m_stopFlag)
                break;
        }
        qDebug()<<"This is in thread["<<currentThreadId()<<"]."<<(int)currentThread();
        sleep(2);
    }
    m_stopFlag = false;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt多线程Qt框架提供的一种多线程编程的解决方案,通过创建和管理多个线程,可以实现在程序中同时执行多个任务的能力。Qt提供了QThread类和QtConcurrent命名空间来支持多线程QThread类是Qt提供的多线程编程的基础类,它封装了与底层操作系统调用相关的函数,并提供了一套简单的API来管理线程的生命周期。通过继承QThread类,我们可以创建自己的线程类,并实现线程执行体run()函数。调用线程的start()函数即可启动线程,并在run()函数中实现需要在新线程中执行的任务。另外,QThread类还提供了其他一些方法,如wait()、msleep()等,用于线程的控制。 QtConcurrent命名空间是Qt提供的一个高级多线程编程的工具,其使用起来更加简单方便。QtConcurrent可以运行同步和异步的任务,主要通过函数调用和lambda表达式来实现。我们可以使用QtConcurrent提供的函数,比如map()、filter()等,将任务分解成多个小的任务,并在多个线程中同时执行。使用QtConcurrent,我们只需要关注任务的输入和输出,而无需关注线程的创建和管理。 无论是使用QThread类还是QtConcurrent命名空间,Qt多线程都遵循的原则是将任务分解成小的子任务,并在多个线程中同时执行,以提高程序的性能和响应速度。同时,Qt多线程也提供了线程间的通信机制,例如使用信号与槽机制、使用QMutex、QSemaphore等同步对象来保证数据的正确访问。 需要注意的是,在多线程编程中,我们需要注意线程之间的同步和互斥,以避免资源竞争和数据不一致等问题。Qt提供了多种同步和互斥的机制,如互斥锁、条件变量等,可以根据具体的需求选择合适的方式来保证线程之间的安全性。 总之,Qt多线程提供了一种方便易用的多线程编程解决方案,使我们可以在Qt程序中充分利用多核处理器的能力,提高程序的性能和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值