QThread :: create在UI线程上运行

问题描述 投票:0回答:1

我需要在我的应用程序中使用多线程。根据Qt的文档,有多种方法可以实现这一目标。

简要概述QThread ing方法:

  1. 子类QThread和重新实现run()(doc)。

  2. 使用QObject方法使用Q_OBJECT宏(从信号/插槽)创建从doWork继承的对象,创建QThread对象,使用QObject::moveToThread(QThread*)并调用QThread::start()docswiki

  3. 使用QThread::create(Function &&f)QThread::create(std::function<>)表示lambda语法。

我选择使用第3个选项进行测试。我还基于选项2实现了一个名为QThreading的多线程库,它使用QWorkerThread充当控制器对象,并以QThreadQObject作为对象。 此库还提供与以下所示相同的结果。


现在文档已不存在问题了。

使用QThread::create(Function &&f),我正在测试以查看QThread是否与UI线程分开运行。下面的MCVE示例:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qsrand(0);
    QThread *thread = nullptr;
    auto threadTest = std::function<void ()> ([&]() {

        if(thread->thread() == a.thread()) {
            qDebug() << "UI Thread in use";
        } else {
            qDebug() << "Worker thread in use";
        }

        for (int var = 0; var < INT_MAX; ++var) {
            int r = qrand() % 100;
            thread->thread()->msleep(r);
            qDebug() << "[Worker Thread " << thread->thread()->currentThreadId() << "] " << r;
        }
    });
    thread = QThread::create(threadTest);
    thread->start();

    for (int var = 0; var < INT_MAX; ++var) {
        // sleep thread 0-100ms
        int r = qrand() % 100;
        a.thread()->msleep(r);
        qDebug() << "[UI Thread " << a.thread()->currentThreadId() << "] " << r;
    }

    return a.exec();
}

输出为:

UI Thread in use
[Worker Thread  0x47e4 ]  41
[UI Thread  0x10c0 ]  38
[UI Thread  0x10c0 ]  19
[UI Thread  0x10c0 ]  38
[Worker Thread  0x47e4 ]  67
[UI Thread  0x10c0 ]  37
[Worker Thread  0x47e4 ]  34
[Worker Thread  0x47e4 ]  0
[UI Thread  0x10c0 ]  55
[Worker Thread  0x47e4 ]  69
[Worker Thread  0x47e4 ]  24
[UI Thread  0x10c0 ]  97
[Worker Thread  0x47e4 ]  78
[UI Thread  0x10c0 ]  65
[Worker Thread  0x47e4 ]  58
[UI Thread  0x10c0 ]  85
[Worker Thread  0x47e4 ]  62
[UI Thread  0x10c0 ]  50
[Worker Thread  0x47e4 ]  64
[UI Thread  0x10c0 ]  12
[Worker Thread  0x47e4 ]  5
[Worker Thread  0x47e4 ]  45

注意事项

  • UI线程ID:0x10c0

  • Worker线程ID:0x47e4

关心的地方

正在使用的UI线程

让我感到困惑的是不同的线程地址,但工作线程仍然与UI线程equal

这使我有2个解释:

  1. QThread::currentThread总是返回主机/主线程(难以置信,使函数有点毫无意义)]]] >>

  2. QThread *thread位于Main UI Thread

    内部,因此(获取父线程)总是返回父线程,即ParentThread == WorkerThread (ParentThread)
  3. 我想念QThread的工作原理吗?

我需要在我的应用程序中使用多线程。根据Qt的文档,有多种方法可以实现这一目标。简要概述QThreading方法:子类QThread和重新实现run()(doc)。 ...

c++ multithreading qt qthread
1个回答
0
投票
  1. 如果您想知道它是否在主线程中运行,则应将currentThread与QCoreApplication线程进行比较:
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.