如 this question 中的建议,我现在正在尝试合并多线程。
根据 the links given by karlphillip ,我知道关于子类化 QThread 的文档不被遵循和使用 moveToThread()
正如所解释的。现在我看到 QThread 的默认实现 run()
只有一个 exec()
然后必须通过调用 quit()
结束当工作线程完成操作时。我现在有几个问题,以便我更好地理解事情:
QApplication* ptrApp=new QApplication(argc,argv);
QThread* th=new QThread;
MyClass* obj=new MyClass;
obj->moveToThread(th);
QObject::connect(th,SIGNAL(started()),obj,SLOT(someFunct()));
QObject::connect(obj,SIGNAL(over()),th,SLOT(quit()));
th->start();
//some GUI code in main thread here
return ptrApp->exec();
如果我继续使用会怎样
someFunct()
即使在我发出over()
之后来自内部someFunct()
?是未定义的行为还是正常的?哪个线程会
obj
现在关联(而发出over()
后的其余代码仍在someFunct
中执行)?我的理解是:不能在th
当我有quit()
那个线程...quit()
将排队直到exec()
在主线程中执行它会导致exec()
在run()
的th
退出(我希望我在这里没有犯错)。我假设该线程不再存在。一次插槽
quit()
对于th
被执行,是否可以安全地假设线程确实已经退出或者我应该进一步连接finished()
th
的信号到某个插槽以绝对确定?
最佳答案
事件循环是否终止并不重要,
somefunct()
将继续运行,直到它把控制权交还给现已结束的循环。obj
与线程保持关联,因此如果发出连接到其插槽之一的信号,则插槽将不会运行,但它将排队等候/如果线程重新启动。
如果QThread
对象被删除,obj->thread()
返回0,所以我想这相当于调用obj->moveToThread (0)
并根据文档:If targetThread is zero, all event processing for this object and its children stops.
quit()
终止事件循环,然后finished()
信号从线程发出,线程终止。
因此,即使您收到finished()
信号,您也不应该假设线程已经完成。您可以在主线程中使用QThread::wait
,在收到该信号后确保这一点。
如果线程处于完成状态,QThread
析构函数已经调用了wait
,所以您可以在finished()<之后安全地删除线程
信号(使用deleteLater()
更安全)。
关于c++ - 关于在我的应用程序中实现 QThread 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728017/