有几篇关于此的文章,但我没有经历过。我正在Windows下运行QT,并尝试启动将覆盖我的应用程序的安装程序。我已经可以在C#中做到这一点,但是对于QT来说,我还是找不到一个“秘密酱料”,它无法使启动的进程比应用程序寿命长。
我已经尝试过更新该过程,因为有人提到如果他们这样做并且不删除QProcess,那么启动器应用程序消失后它就可以继续使用。我试过了,但是一旦我的应用退出,一切都会消失,尽管有内存泄漏。我无法继续运行该应用程序,因为与Linux不同,Windows不允许您在运行时覆盖该应用程序。有人知道怎么做吗?
我需要做的非常简单:
<template>
<div>
<font-awesome-icon :icon="['fas','spinner','spin' ]" />
</div>
</template>
答案 0 :(得分:2)
实际上,它按照OP的描述工作。
这是我的MCVE演示。
1)子应用程序testQProcessChild.cc
:
#include <chrono>
#include <thread>
#include <iostream>
int main()
{
std::cout << "testQProcessChild started.\n"
<< "Sleeping for three seconds...\n";
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "testQProcessChild exits.\n";
return 0;
}
经过编译和测试:
$ g++ -std=c++11 -o testQProcessChild testQProcessChild.cc
$ ./testQProcessChild
testQProcessChild started.
Sleeping for three seconds...
testQProcessChild exits.
$
2)Qt应用程序testQProcessDetached.cc
:
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QProcess qProcess;
//qProcess.closeWriteChannel();
//qProcess.closeReadChannel(QProcess::StandardOutput);
//qProcess.closeReadChannel(QProcess::StandardError);
if (qProcess.startDetached(QString::fromLatin1("./testQProcessChild"))) {
qDebug() << "./testQProcessChild started.";
} else {
qDebug() << "Cannot start ./testQProcessChild!";
}
qDebug() << "testQProcessDetached exiting.";
return 0;
}
带有项目文件testQProcessDetached.pro
:
SOURCES = testQProcessDetached.cc
QT = widgets
经过编译和测试:
$ qmake-qt5 testQProcessDetached.pro
$ make
$ ./testQProcessDetached
testQProcessChild started.
Sleeping for three seconds...
./testQProcessChild started.
testQProcessDetached exiting.
$ testQProcessChild exits.
请注意,testQProcessDetached
退出,可以看到提示$
再次出现。大约3秒钟后,输出testQProcessChild exits.
出现了(以证明testQProcessChild
比testQProcessDetached
寿命更长)。
我怀疑渠道连接可能是一个问题。因此,在第一次成功尝试之后,我评论了close???Channel()
调用并重复了测试-结果与以前相同。
我已经在Windows 10的cygwin64中进行了测试。
示例testQProcessDetached.cc
已修改为GUI应用程序:
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QPushButton qBtn(QString::fromUtf8("Start Child"));
qBtn.show();
QObject::connect(&qBtn, &QPushButton::clicked,
[&](bool) {
QProcess qProcess;
//qProcess.closeWriteChannel();
//qProcess.closeReadChannel(QProcess::StandardOutput);
//qProcess.closeReadChannel(QProcess::StandardError);
if (qProcess.startDetached(QString::fromLatin1("./testQProcessChild"))) {
qDebug() << "./testQProcessChild started.";
QApplication::quit();
} else {
qDebug() << "Cannot start ./testQProcessChild!";
}
});
return app.exec();
}
经过编译和测试:
$ qmake-qt5 testQProcessDetached.pro
$ make
$ ./testQProcessDetached
点击
testQProcessChild started.
Sleeping for three seconds...
./testQProcessChild started.
testQProcessDetached exiting.
$ testQProcessChild exits.
我使用Qt for Windows在VS2013上编译了第二个示例。效果也不错。
因此,我不得不用相对路径./testQProcessChild
替换为绝对路径(尽管两个二进制文件都位于同一目录中)。正如OP所说的那样,我对此并不在意。
答案 1 :(得分:0)
一种快速而肮脏的解决方案是在Windows命令脚本中运行安装程序可执行文件,然后QProcess命令脚本。然后在脚本开始处放置3-5秒的“超时”命令,以确保原始可执行文件已完成。
答案 2 :(得分:0)
事实证明,我发布的方法确实有效,但是如果您在调试器中运行应用程序,则该方法无效。显然,为了安全起见,调试器会在应用终止时关闭所有产生的线程/进程。谢谢大家的回答!