0

我用 QtCreator 和 C++ 编写了一个 qt 快速桌面应用程序。

我想从我的应用程序启动另一个应用程序。我搜索并找到了这些选项:Qprocess,具有以下功能:start、startDetached 和 execute。

我要启动的应用程序是单个应用程序,其他人建议我使用函数 startDetached。

我选择了 startDetached 函数的这个选项:

bool startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 )

这是我的代码:

QProcess *process=new QProcess(this);
bool res;
    QStringList argsList;
    argsList.append("-start");
    process->startDetached(emulauncherInstallationDirectory + "\\Emulauncher.exe",argsList,emulauncherInstallationDirectory);
    res = process->waitForFinished();
    delete process;
    process=NULL;
    return res;

但是当我运行我的应用程序时,它有时运行良好,而在其他时候则根本不起作用。

我调试了很多次,看到这个功能

进程->waitForFinished();

返回 false 或 true,没有明显的原因:在所有时间 .exe 文件都在它的位置,如果我从命令行运行它,或者通过双击文件,它运行良好,但是从我的应用程序 - 它有时运行良好,有时真的不行。

任何人都知道它的任何原因或这个奇怪问题的任何解决方案吗?

任何答案将不胜感激。

4

2 回答 2

3

从文档中:

bool QProcess::waitForFinished (int msecs = 30000)

如果进程完成,则返回 true;否则返回 false(如果操作超时,如果发生错误,或者如果此 QProcess 已经完成)。

因此process->waitForFinished();,如果您的过程在 30 秒内完成,则返回 true,否则返回 false。

process->waitForFinished(-1);如果您根本不想超时,请使用。

于 2012-12-11T13:46:38.123 回答
2

会不会是超时问题?默认情况下,waitForFinished()等待 30 秒:

bool QProcess::waitForFinished (int msecs = 30000)

阻塞直到进程完成并发出finished() 信号,或者直到msecs 毫秒过去。

如果进程完成,则返回 true;否则返回 false(如果操作超时,如果发生错误,或者如果此 QProcess 已经完成)。

此函数可以在没有事件循环的情况下运行。它在编写非 GUI 应用程序和在非 GUI 线程中执行 I/O 操作时很有用。

警告:从主 (GUI) 线程调用此函数可能会导致您的用户界面冻结。

如果 msecs 为 -1,则此函数不会超时。

waitForFinished(-1)如果你想永远等待,你应该使用。

于 2012-12-11T13:47:52.283 回答