Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何并行启动几个QProcess并阻塞,直到所有QProcess都退出?_C++_Qt - Fatal编程技术网

C++ 如何并行启动几个QProcess并阻塞,直到所有QProcess都退出?

C++ 如何并行启动几个QProcess并阻塞,直到所有QProcess都退出?,c++,qt,C++,Qt,我想并行地启动几个QProcess,并阻止它们,直到它们全部退出 我正在考虑将每个QProcess*放在一个向量中,并将完成的信号连接到一个计数器。主线程忙碌地等待,直到计数器达到向量的大小 但是,我担心计数器可能不是线程安全的,而且效率也不是很高。您肯定应该使用QMutex保护计数器 我认为效率没有任何问题。你怕什么 尽管存在一个隐藏的潜在问题——进程可能不会发出完成的信号。例如,如果它无法启动,它将使用QProcess::FailedToStart代码发出QProcess::error,如果

我想并行地启动几个QProcess,并阻止它们,直到它们全部退出

我正在考虑将每个QProcess*放在一个向量中,并将完成的信号连接到一个计数器。主线程忙碌地等待,直到计数器达到向量的大小


但是,我担心计数器可能不是线程安全的,而且效率也不是很高。

您肯定应该使用QMutex保护计数器

我认为效率没有任何问题。你怕什么


尽管存在一个隐藏的潜在问题——进程可能不会发出完成的信号。例如,如果它无法启动,它将使用QProcess::FailedToStart代码发出QProcess::error,如果它崩溃,它将使用QProcess::Crash代码发出error。在这两种情况下,线程都将等待永恒。

您肯定应该使用QMutex保护计数器

我认为效率没有任何问题。你怕什么


尽管存在一个隐藏的潜在问题——进程可能不会发出完成的信号。例如,如果它无法启动,它将使用QProcess::FailedToStart代码发出QProcess::error,如果它崩溃,它将使用QProcess::Crash代码发出error。在这两种情况下,您的线程都将等待永恒。

如果您将所有完成的信号连接到主线程中的单个对象,则无需担心保护计数器。每个信号将在主线程中依次排队和处理。只需确保在连接时使用

Amartel在让它们运行之前检查确保它们启动是正确的

编辑: 正如这里所提到的,您也可以考虑连接到错误信号。

也可以考虑。它就是为这个明确的目的而设计的。

如果将所有完成的信号连接到主线程中的单个对象,就不必担心保护计数器。每个信号将在主线程中依次排队和处理。只需确保在连接时使用

Amartel在让它们运行之前检查确保它们启动是正确的

编辑: 正如这里所提到的,您也可以考虑连接到错误信号。

也可以考虑。它就是为了这个目的而设计的。

如果只增加主线程中的计数器,计数器将是线程安全的。请记住,跨线程信号是排队的。同样,正如Amartel所说,确保进程真正开始时避免永远等待。我会使用信号和插槽,而不是忙着等待,或者您的主应用程序是非gui应用程序?如果只增加主线程中的计数器,计数器将是线程安全的。请记住,跨线程信号是排队的。同样,正如Amartel所说,确保过程真正开始,以避免永远等待。我会使用信号和插槽,而不是忙着等待,或者您的主应用程序是非gui应用程序?检查启动是否成功是一个好主意。不过,如果它崩溃了,它仍然会发出结束的声音。我一般不喜欢忙着等。我想要启动的进程通常需要几分钟的时间,而繁忙的等待基本上占用了一个可以用于其他事情的CPU核心。我想我可以调用qSleep,但一般来说,我在寻找等待/通知机制,这就是QThread::exec的作用。线程将休眠,直到发出信号。顺便说一句,有一篇关于QThread:P.S.的正确用法的小文章:Phlucious的答案要好得多。检查启动是否成功是一个好主意。不过,如果它崩溃了,它仍然会发出结束的声音。我一般不喜欢忙着等。我想要启动的进程通常需要几分钟的时间,而繁忙的等待基本上占用了一个可以用于其他事情的CPU核心。我想我可以调用qSleep,但一般来说,我在寻找等待/通知机制,这就是QThread::exec的作用。线程将休眠,直到发出信号。顺便说一句,有一篇关于QThread:P.S.的正确用法的小文章:Phlucious的答案要好得多。我想,处理QProcess::started signal也可以做到这一点。有了信号和插槽,根本不需要等待。我甚至不确定是否需要将QProcess存储在QVector中,因为信号的接收器可以在完成时使用QObject::sender来销毁QProcess。我想,处理QProcess::started信号也可以做到这一点。True。有了信号和插槽,根本不需要等待。我甚至不确定是否需要将QProcess存储在QVector中,因为信号的接收器可以使用QObject::sender在完成时销毁QProcess。