2017-02-15 1 views
2

私はクリックボタンでcliプログラムを起動するGUIプログラムを持っています。私はコンソールウィンドウを見たいので、cliプログラムが終了するまで待つ必要はありません。だから私はこのようなコードを使用する:QProcess :: startDetached()コンソールウィンドウを表示しない

QProcess::startDetached("cmd.exe"); 

クリックした後、私はコンソールウィンドウが表示されません。しかし、タスクマネージャのcmd.exeプロセスを参照してください。

私はsystem()コマンドを使用しようとしましたが、cliプログラムが終了する前にアプリケーションをフリーズしました。

ウィンドウを表示する方法はありますか?

答えて

-1

これは予想される動作です。少なくともWindowsではstartDetachedCreateProcessDETACHED_PROCESSフラグで呼び出すのと同等です。新しいプロセスは親のコンソールを継承しません。それは、他のプラットフォームでも同様のことが起こることになります。

この場合、新しいプロセスにAllocConsoleを使用して手動で割り当てる必要があります(ストリーミングハンドルを新しいコンソールにリダイレクトする必要があるかもしれないことに注意してください)。または、別の(CreateProcessまたはforkを確認してください)。

ところで、systemは、同期呼び出しであるためアプリケーションがフリーズするため、他のプロセスが終了するまでコントロールを返さないためです。別のスレッドからsystemを呼び出すと、アプリケーションのメインイベントループをブロックしないようにすることができます。

+0

ありがとうございました。今私はQThreadとsystem()コマンドを使用しています。このソリューションはコードをより複雑にしますが、これは作業とクロスプラットフォームです。 – Andrey

+0

ところで、Qtに加えてBoostの使用について気にしないで 'system'呼び出しが完全に非同期である場合は、' boost :: thread(){system { "cmd.exe");}); ' – cbuchart

関連する問題