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;