C++ 为什么不能在静态析构函数中等待Qt进程完成?
下面的代码启动一个进程,该进程需要一秒钟才能完成,然后等待该进程完成,然后退出。由于某种原因,以下代码挂起在C++ 为什么不能在静态析构函数中等待Qt进程完成?,c++,qt,C++,Qt,下面的代码启动一个进程,该进程需要一秒钟才能完成,然后等待该进程完成,然后退出。由于某种原因,以下代码挂起在p->waitForFinished()中,即使进程确实完成了 #include <QtCore/QProcess> class A { public: A(): p(0) { } ~A() { p->waitForFinished(); delete p; }
p->waitForFinished()
中,即使进程确实完成了
#include <QtCore/QProcess>
class A
{
public:
A():
p(0)
{
}
~A()
{
p->waitForFinished();
delete p;
}
void start()
{
p = new QProcess(0);
p->start("sleep 1");
}
QProcess *p;
};
int main(void)
{
static A a;
a.start();
return 0;
}
waitForFinished()
调用成功。这是一个Qt错误,还是预期的行为?我的怀疑是,一旦调用A
的析构函数,检测成功完成的应用程序是否已经被销毁所需的某种逻辑。您试图同时清理由QProcess
两种不同方式创建的线程,因此这是您程序中的一个错误
您通过从main
返回来分离线程(这将终止进程中的所有线程,如果它们是可连接的,则分离它们)
通过waitForFinished
连接QProcess
线程,您已经清理了它
你可以分离一个线程,也可以连接它,但你不能两者兼而有之,即使是间接的。显然,分离成功,而加入挂起
这很可能是因为QProcess
使用自己的终止信号,而不是线程库中内置的终止信号。因此,来自main
的返回会在发送终止信号之前终止线程,而waitForFinished
函数将等待一个永远不会发送的信号
一般来说,线程不应该在构造函数中创建,也不应该在析构函数中清理。这主要是因为这些操作的计时需要比可能的更明确的控制。它们不应该在main
启动之前创建,也不应该在main
返回之后清理——同样,因为您需要控制这些事情发生的上下文
A a;