您没有在线程中运行事件循环QProcess
实例存在。任何QObject
在没有事件循环的线程中只有部分功能 - 计时器不会运行,排队的调用不会被传递,等等。所以你不能这样做。使用QObject
s with QtConcurrent::run
需要照顾。
至少,只要进程存在,您就应该有一个临时事件循环 - 在这种情况下,您应该持有QProcess
按价值计算,因为deleteLater
事件循环退出后不会执行。
QProcess process;
...
QEventLoop loop;
connect(process, &QProcess::finished, &loop, &QEventLoop::quit);
loop.exec();
否则,您需要将进程保留在更持久的线程中,并保留该线程句柄(QThread
只是一个句柄!)在一个具有事件循环的线程中,可以在完成后对其进行处理。
// This can be run from a lambda that runs in an arbitrary thread
auto thread = new QThread;
auto process = new QProcess;
...
connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[this, process](int exitCode, QProcess::ExitStatus exitStatus){
...
process->deleteLater();
process->thread()->quit();
});
process->start("VBoxManage", {"list", "vms"});
process->moveToThread(thread);
// Move the thread **handle** to the main thread
thread->moveToThread(qApp->thread());
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
唉,这非常愚蠢,因为您正在创建临时线程,而且既昂贵又浪费。你应该有one额外的工作线程,您可以在其中处理所有低开销工作,例如QProcess
相互作用。该线程应该始终运行,并且您可以移动所有QProcess
以及与之类似的对象实例,来自并发 lambda 等。