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;
}

猜你喜欢

转载自blog.csdn.net/technologyleader/article/details/82023904