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;

しかし、アプリケーションを実行していると、うまく動作することもあれば、まったく動作しないこともあります。

私はそれを何度もデバッグしましたが、関数が

process->waitForFinished();

明らかな理由なしに、false または true を返します。常に .exe ファイルがその場所にあり、コマンド ラインから実行している場合、またはファイルをダブルクリックして実行している場合は、正常に実行されますが、私のアプリケーション - うまく動くこともあれば、うまくいかないこともあります。

その理由やこの奇妙な問題の解決策について知っている人はいますか?

どんな答えでもいただければ幸いです。

4

2 に答える 2

3

ドキュメントから:

bool QProcess::waitForFinished ( int ミリ秒 = 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 ミリ秒 = 30000 )

プロセスが終了して finished() シグナルが発行されるまで、または msecs ミリ秒が経過するまでブロックします。

プロセスが終了した場合は true を返します。それ以外の場合は false を返します (操作がタイムアウトした場合、エラーが発生した場合、またはこの QProcess が既に終了している場合)。

この関数は、イベント ループなしで動作できます。これは、非 GUI アプリケーションを作成する場合や、非 GUI スレッドで I/O 操作を実行する場合に役立ちます。

警告: メイン (GUI) スレッドからこの関数を呼び出すと、ユーザー インターフェイスがフリーズする可能性があります。

msecs が -1 の場合、この関数はタイムアウトしません。

waitForFinished(-1)永遠に待ちたい場合に使用する必要があります。

于 2012-12-11T13:47:52.283 に答える