专栏首页跟Qt君学编程Qt线程使用的两种方法

Qt线程使用的两种方法

QThread类提供一种独立于平台的线程管理方式。

方法1

一个QThread实例管理程序中的一个线程。QThread的执行开始于run()。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。   你可以使用QObject::moveToThread()将工作对象移动到线程中使用。

  • 示例:
class Worker : public QObject
{
    Q_OBJECT
public slots:
    void doWork(const QString &parameter) {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }

signals:
    void resultReady(const QString &result);
};

class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    Controller() {
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &Controller::operate, worker, &Worker::doWork);
        connect(worker, &Worker::resultReady, this, &Controller::handleResults);
        workerThread.start();
    }

    ~Controller() {
        workerThread.quit();
        workerThread.wait();
    }

public slots:
    void handleResults(const QString &);

signals:
    void operate(const QString &);
};

  将线程移动到工作线程内执行。因为在线程中有队列的信号槽连接机制,所以在不同线程中使用信号槽是安全的。

方法2

  另一种单独在线程中执行的方式是继承QThread后重新实现run()函数(run函数内用户的执行操作)。

  • 示例:
class WorkerThread : public QThread
{
    Q_OBJECT
    void run() override {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }
signals:
    void resultReady(const QString &s);
};

void MyObject::startWorkInAThread()
{
    WorkerThread *workerThread = new WorkerThread(this);
    connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
    connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
    workerThread->start();
}

本文分享自微信公众号 - Qt君(qtjuna)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 将文档导出为pdf

    Qt君
  • 兼容Qt4/Qt5版本Qml控件Triangle

    Qt君
  • Qt开源网络库[2]-接口篇

    上一篇介绍了Qt开源网络库,有兴趣的可以翻开往期推送.今篇主要介绍该开源网络库接口的用法.

    Qt君
  • 2014网络安全APT攻击专题分析

    1.警惕利用Bash漏洞的IRC-BOT 什么是Bash安全漏洞 继2014年4月的“Openssl心脏流血”漏洞之后,另一个重大互联网威胁于2014年9月24...

    安恒信息
  • Reverse Words in a String

    Tyan
  • 八、IO优化(3)稀疏列

      稀疏列减少了 Null 值的空间需求,但代价是检索非 Null 值的开销增加。 当至少能够节省 20% 到 40% 的空间时,才应考虑使用稀疏列。

    py3study
  • Mysql查询及高级知识整理(上)

    SQL:Structured Query Language,结构化查询语言。

    疯狂的KK
  • 腾讯发布新版QQv8.9.6 可撤回他人消息

    雨尘
  • Kettle与Hadoop(四)导入导出Hadoop集群数据

    http://wiki.pentaho.com/download/attachments/23530622/weblogs_rebuild.txt.zip?ve...

    用户1148526
  • 数据分析篇 | Pandas基础用法5

    Series 提供了一个可以简单、快捷返回 datetime 属性值的访问器。这个访问器返回的也是 Series,索引与现有的 Series 一样。

    叫我龙总

扫码关注云+社区

领取腾讯云代金券