正如this question中所建议的那样,我现在正在尝试合并多线程。关于在我的应用程序中实现QThread的问题?
根据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
退出(我希望我不是一个错误在这里)。我假设线程不再存在。一旦
th
插槽quit()
执行,是安全的假设线程确实已经退出,还是应该我的th
finished()
信号进一步连接到某些插槽是绝对肯定吗?
感谢 1.亚这就是我被注意到的行为......只是想确保它不是未定义/非法或东西 2.确定...请告诉我,如果我删除会发生什么QThread指针'th'(现在因为我们不能重新启动线程了,我想) 3. for'quit()'我明白,它将在队列中执行直到'exec()'在主线程中执行它...但'finished()'是一个不需要任何事件循环的信号,它是终止线程所要做的最后一件事情,为什么需要另外指定'QThread :: wait()'使用'finished()'信号? – ustulation 2012-03-16 11:59:41
对于2.您可以根据需要随时停止并重新启动线程。对于3.发射信号不需要事件循环。无论如何,连接它的插槽应该在另一个线程中运行事件循环(线程eventloop不能接收到它自己的finished()信号)。但在查看QThread的来源后,我认为在大多数情况下,您可以等待完成的信号。 – alexisdm 2012-03-16 14:21:52