9

有没有办法强制主线程等到从它创建的所有线程完成它们的工作,然后再完成程序。我是说:

int main(){
    QthreadClass a; // in cons' a thread is created and running
    QthreadClass b; // same as before

    *** wish to wait till both created thread finished their jobs ***

    return 0;

}

4

2 回答 2

14

那么,怎么样:

a.wait();
b.wait();

或者,您宁愿启动一个事件循环(通常用于 Qt 应用程序),当您的两个线程都结束时退出(QThread 发出 finished() 和 terminate() 信号)。

于 2013-03-10T15:51:19.853 回答
5

通常,使用 Qt,您将拥有一个基于 QApplication 的类,该类带有带有信号和插槽的事件循环,除非您愿意,否则它不会退出主函数。在这种情况下,您可以简单地将 QThread::finish() 信号连接到一个检查所有线程是否已完成的槽。

没有事件循环和信号/槽,Qt 线程没有 join() 方法,在其他线程实现中可以找到,但 QThread::wait() 有点相似。

bool QThread::wait(unsigned long time = ULONG_MAX)

阻塞线程,直到满足以下任一条件:

  • 与此对象关联的线程QThread已完成执行(即,当它从 中返回时QThread::run())。true如果线程完成,此函数将返回。true如果线程尚未启动,它也会返回。
  • time毫秒已经过去。如果 time 是ULONG_MAX(默认值),则等待永远不会超时(线程必须从 中返回QThread::run())。false如果等待超时,此函数将返回。

请注意,阻塞主线程被认为是一种糟糕的做法,即使是计算也不行,更不用说只是等待某事了。任何超过几十毫秒的时间都会对用户体验产生不利影响,并且更高的停顿可能会给您来自操作系统的“此应用程序没有响应”消息。如果您等待结果,请在另一个线程中等待它,并且只有在完成后才将其传递给主线程。

于 2013-03-10T15:59:20.880 回答