下面的代码启动一个过程,需要一秒钟才能完成,然后在退出之前等待该过程完成.出于某种原因,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;
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦a没有静态声明,但如下:
A a;
Run Code Online (Sandbox Code Playgroud)
该waitForFinished()调用成功.这是一个Qt错误,还是这个预期的行为?我怀疑,一旦A调用析构函数,检测应用程序是否成功完成所需的某种逻辑已被破坏.
Dav*_*rtz 10
您已尝试同时清理以QProcess两种不同方式创建的线程,因此这是程序中的错误.
你已经通过返回来分离线程main(它终止进程中的所有线程,如果它们是可连接的则分离它们).
而且你QProcess通过加入它来清理线程waitForFinished.
你可以分离一个线程,或者你可以加入它,但你不能两者都做,甚至是间接的.显然,分离获胜,并且联接挂起.
这很可能是因为QProcess它使用了自己的终止信号,而不是内置在线程库中的信号.因此,返回从main终止线程之后才能发送终止信号,让waitForFinished函数等待永远不会发送的信号.
作为一般规则,不应在构造函数中创建线程,也不应在析构函数中清除线程.这主要是因为这些操作的时间要求比可能的更明确的控制.它们永远不应该在main开始之前创建,也不应该在main返回后清理- 再次因为你需要控制这些事情发生的环境.