gpt4 book ai didi

multithreading - 确保 QProcess 在其父 QThread 终止时终止

转载 作者:行者123 更新时间:2023-12-03 12:56:34 24 4
gpt4 key购买 nike

我正在 Qt 中编写代码,其中我使用多个线程(Qthreads)以下面代码片段中显示的方式启动命令行进程:

void test_streamer_thread::run()
{
QProcess start_process;
...

ret_status = start_process.execute("some_cmd.exe",some_args);
start_process.close();
}

一旦启动,该进程将无限继续(在 Windows 任务管理器中显示为一个单独的进程)。但是,当应用程序终止时,该进程仍然继续存在。如何确保此进程在启动它的应用程序终止时终止。

最佳答案

使用单独的线程来启动进程是完全没有必要的。

确保在应用程序终止时终止子进程的最简单方法是

QProcess * p = new QProcess(....);
connect(qApp, SIGNAL(aboutToQuit()), process, SLOT(terminate()));

请参阅下面的完整示例。

这种误解像疾病一样蔓延,线程是解决每个人问题的方法。我的观察是,在 10 个帖子中有 9 个带有 Qt标签,线程的使用是不必要的,是不了解问题的结果。

我的规则是:如果你认为你需要使用线索,试着解释它,如果只是在你的脑海中,说服你的同事。完成此操作后,请检查您引用的所有支持您的论点的事实是否确实如此。在许多情况下,它们不是。

下面的示例代码不会捕获 Unix 信号,因此——正如您在 Linux 和 OS X 上会注意到的那样——它只会终止直接后代进程,而不是任何可能已经从它启动的后续进程。你会 need to handle Unix signals解决这个问题。
//main.cpp
#include <QApplication>
#include <QPushButton>
#include <QProcess>

class Launcher : public QObject
{
Q_OBJECT
int n;
QProcess * process;
signals:
void setDisabled(bool);
public slots:
void launch() {
QStringList args;
args << QString::number(n);
process = new QProcess(this);
process->start(QCoreApplication::applicationFilePath(), args);
connect(qApp, SIGNAL(aboutToQuit()), process, SLOT(terminate()));
emit setDisabled(true);
}
public:
Launcher(int no) : n(no), process(0) {}
~Launcher() {
if (process) {
process->terminate();
process->waitForFinished();
}
}
};

int main(int argc, char ** argv)
{
QApplication a(argc, argv);
int n = 0;
if (argc > 1) n = QByteArray(argv[1]).toInt();
Launcher launcher(n+1);
QPushButton spawn(QString("Spawn #%1").arg(n));
launcher.connect(&spawn, SIGNAL(clicked()), SLOT(launch()));
spawn.connect(&launcher, SIGNAL(setDisabled(bool)), SLOT(setDisabled(bool)));
spawn.show();
return a.exec();
}

#include "main.moc"

关于multithreading - 确保 QProcess 在其父 QThread 终止时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11412757/

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