gpt4 book ai didi

c++ - QThread moveToThread 不起作用

转载 作者:行者123 更新时间:2023-11-28 01:44:46 26 4
gpt4 key购买 nike

我有一个用于 GUI 的主线程,其中运行 MainWindow 对象,在它的构造函数中,我创建了一个新的 worker 对象和一个 QThread 对象,然后我将 worker 移动到线程,问题是当打印它们的 id 时,它们是相同的:

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
std::cout<<"MAIN_ID "<< QThread::currentThreadId()<<std::endl;
QThread *t_pc = new QThread;
worker *pc_w;
pc_w = new pc_worker();
pc_w->moveToThread(t_pc);
t_pc->start();
pc_w->initialize();
// ...
}

worker.cpp

worker::worker(QObject *parent) : QObject(parent) {

}

void worker::initialize() {
std::cout << "INITIALIZE " << QThread::currentThreadId() << std::endl;
}

我得到:

MAIN_ID 0x7f4009ccb780
INITIALIZE 0x7f4009ccb780

怎么了?

最佳答案

答案:moveToThread 确实有效,只是不是以您预期的方式。

看起来在调用 pc_w->moveToThread(t_pc) 之后,您希望现在在 t_pc 中调用 pc_w 的所有成员函数。然而,这不是 moveToThread() 所做的。

moveToThread() 的目的是改变QObject“线程关联”,换句话说,对象所在的线程。 但是在基本层面上,它为您提供的一切只是保证通过Qt::QueuedConnection 连接到任何信号的所有对象槽将被调用(运行)在该特定线程中。

成员函数仍然在您调用它们的线程中运行。在您的情况下,您从 GUI 线程调用 initialize(),因此 QThread::currentThreadId() 为您提供该线程的 id

我真的建议阅读关于 thread affinity 的官方文档和 this article在线程事件循环上。

QThread* thread = new QThread;
Worker* worker = new Worker;

// Uses Qt::AutoConnection (default)
// which will be transalted into Qt::QueuedConnection
QObject::connect(thread, &QThread::started, worker, &Worker::initialize);

std::cout<<"MAIN_ID "<< QThread::currentThreadId()<<std::endl;

worker->moveToThread(thread);
thread->start();

输出:

MAIN_ID 0000000000003E5C
INITIALIZE 0000000000003DAC

trivelt提出的解决方案人为地将“call initialize()”事件放入线程事件循环中达到同样的效果。但是,它不执行任何编译时检查(“initialize”被指定为字符串)。

关于c++ - QThread moveToThread 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45606648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com