Qt 多线程

发布于 2024-10-18 13:01:26 字数 1754 浏览 3 评论 0

QThread 的常见特性

run

run() 是线程的入口,就像 main() 对于应用程序的作用。

QThread 中对 run() 的默认实现调用了 exec() ,从而创建一个 QEventLoop 对象,由其处理该线程事件队列(每一个线程都有一个属于自己的事件队列)中的事件。

简单用代码描述如下:

int QThread::exec()
{
//...
    QEventLoop eventLoop;
    int returnCode = eventLoop.exec();
//...
    return returnCode;
}
  
int QEventLoop::exec(ProcessEventsFlags flags)
{
//...
    while (!d->exit) {
        while (!posted_event_queue_is_empty) {
            process_next_posted_event();
        }
    }
//...
}

由此可见,exec() 在其内部不断做着循环遍历事件队列的工作,调用 QThreadquit()exit() 方法使停止工作,尽量不要使用 terminate() ,该方法过于粗暴,造成资源不能释放,甚至互斥锁还处于加锁状态。

推荐的使用方式:

#include <QtCore>
class Worker : public QObject
{
    Q_OBJECT
private slots:
    void onTimeout()
    {
        qDebug()<<"Worker::onTimeout get called from?: "<<QThread::currentThreadId();
    }
};
  
#include "main.moc"
  
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"From main thread: "<<QThread::currentThreadId();
  
    QThread t;
    QTimer timer;
    Worker worker;
  
    QObject::connect(&timer, SIGNAL(timeout()), &worker, SLOT(onTimeout()));
    timer.start(1000);
  
    worker.moveToThread(&t);
  
    t.start();
  
    return a.exec();
}

这是 Qt4.7 及以后版本推荐的工作方式。

其主要特点就是利用 Qt 的事件驱动特性,将需要在次线程中处理的业务放在独立的模块(类)中,由主线程创建完该对象后,将其移交给指定的线程,且可以将多个类似的对象移交给同一个线程。

在这个例子中,信号由主线程的 QTimer 对象发出,之后 Qt 会将关联的事件放到 worker 所属线程的事件队列。

由于队列连接的作用,在不同线程间连接信号和槽是很安全的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

南街女流氓

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

emdigitizer10

文章 0 评论 0

残龙傲雪

文章 0 评论 0

奢望

文章 0 评论 0

微信用户

文章 0 评论 0

又爬满兰若

文章 0 评论 0

独孤求败

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文