我需要在我的应用程序中使用多线程。根据Qt的文档,有多种方法可以实现这一目标。
简要概述QThread
ing方法:
子类QThread和重新实现run()(doc)。
使用QObject
方法使用Q_OBJECT
宏(从信号/插槽)创建从doWork
继承的对象,创建QThread
对象,使用QObject::moveToThread(QThread*)并调用QThread::start()
(docs, wiki)
使用QThread::create(Function &&f)或QThread::create(std::function<>)
表示lambda语法。
我选择使用第3个选项进行测试。我还基于选项2实现了一个名为QThreading的多线程库,它使用QWorkerThread充当控制器对象,并以QThread
和QObject
作为对象。 此库还提供与以下所示相同的结果。
现在文档已不存在问题了。
使用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个解释:
QThread::currentThread
总是返回主机/主线程(难以置信,使函数有点毫无意义)]]] >>
QThread *thread
位于Main UI Thread
ParentThread == WorkerThread (ParentThread)
我想念QThread
的工作原理吗?
我需要在我的应用程序中使用多线程。根据Qt的文档,有多种方法可以实现这一目标。简要概述QThreading方法:子类QThread和重新实现run()(doc)。 ...