gpt4 book ai didi

c++ - 为什么不能等待 Qt 进程在静态析构函数中完成?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:23 26 4
gpt4 key购买 nike

以下代码启动一个需要一秒钟才能完成的进程,然后等待该进程完成后再退出。出于某种原因,以下代码在 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;
}

但是,只要a不是静态声明的,而是如下:

A a;

waitForFinished() 调用成功。这是 Qt 错误,还是这是预期的行为?我怀疑一旦调用 A 的析构函数,检测应用程序是否成功完成所需的某种逻辑已经被销毁。

最佳答案

您尝试同时以两种不同的方式清理由 QProcess 创建的线程,因此这是您程序中的错误。

您已经通过从 main 返回来分离线程(它终止进程中的所有线程,如果它们是可连接的则分离它们)。

并且您已经通过 waitForFinished 加入它来清理 QProcess 线程。

您可以分离一个线程,也可以加入它,但您不能两者都做,即使是间接的。显然,分离成功,连接挂起。

这很可能是因为 QProcess 使用了它自己的终止信号,而不是线程库中内置的信号。因此 main 的返回在线程可以发送该终止信号之前终止线程,让 waitForFinished 函数等待一个永远不会发送的信号。

作为一般规则,不应在构造函数中创建线程,也不应在析构函数中清除线程。这主要是因为这些操作的时间需要比可能的更明确的控制。并且它们不应该在 main 启动之前创建,也不应该在 main 返回之后清除——同样,因为您需要控制这些事情发生的上下文。

关于c++ - 为什么不能等待 Qt 进程在静态析构函数中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com