使主线程等到所有其他Qthread完成

kak*_*ush 7 c++ qthread

有没有办法强制主线程等到从它创建的所有线程完成他们的工作,然后才能完成程序.我的意思是:

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;
Run Code Online (Sandbox Code Playgroud)

}

Arc*_*hie 10

那么,怎么样:

a.wait();
b.wait();
Run Code Online (Sandbox Code Playgroud)

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


dte*_*ech 5

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

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

bool QThread::wait(unsigned long time = ULONG_MAX)
Run Code Online (Sandbox Code Playgroud)

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

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

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