3

私は、任意のキーを押すことで中断するオプションを持つC++コンソールアプリケーションを持っています(kbhit()を使用して実装されています)。それでもフィードバックを出力します)。そのコンソール アプリケーション用に ac# gui アプリケーションを作成しており (c# フォームから exe ファイルを呼び出しています)、キーボードの任意のキーを押す代わりに、Environment.NewLine (または "\n ") リダイレクトされた入力と C++ アプリケーションでは、動作させるために kbhit() とは別のものを使用する必要があります。次のように、cin.get() を使用してみました。

if (kbhit() || (cin.get() > 0))  
    stop_recording=true;  

しかし、cin.get() はブロッキング関数であり、コンソール アプリケーションを最後まで実行したい場合、停止ボタンを押さないと閉じません。実際にブロックしていない cin.get() に似た関数はありますか、それとも c# からコンソール アプリケーション プロセスに「任意のキー」を送信する別の方法でしょうか?

4

3 に答える 3

0

_getch()のinstedを使用しcin.get()ます。それはブロッキングコマンドですが、それを実行するだけif ( _kbhit() ) ですぐに戻ります。

于 2012-04-24T13:03:40.137 に答える
0

ここで非常に簡単な答えが見つかりました: C++でのスレッド化の簡単な例。クレジットはEdwardKmettに送られます。
たまたまc++アプリケーションでboostライブラリを使用したので、boostスレッドの実装も使用できました。それは非常に単純でした、これは私のスレッド関数がどのように見えるかです:

bool stopped=false;

void inputSent() //
{  
    if (kbhit() || (cin.get() > 0))  
        stopped=true;  

}  

その後、main.cppで:

boost::thread stoppedThread = boost::thread(inputSent);  

その後、stopped == trueかどうかを確認し、stoppedThread.joinを使用していません(プログラムがいつ終了するかわからないため、ゾンビスレッドを残す場合は、それが間違いかどうかはわかりません)後ろに...多分誰かがそれについて私に教えてくれるかもしれません)。

于 2012-04-25T10:10:11.520 に答える
0

Ctrl+C をコンソール プロセスに送信して、ブレーク動作をトリガーすることができます。

続行する必要がある場合は、名前付き同期オブジェクトを確認できます。つまり、UI プロセスで名前付き Mutex/Semaphore (ランダムな名前) を作成し、この名前をコンソール プロセスに渡します。コンソール プロセスは、Mutex/Semaphore を取得できるかどうか (kbhit の代わりに) ときどきチェックし、取得できなくなったら停止します。

@Komyg が提案する他のオプションは、コンソールを読み取る専用のスレッドを作成し、特定の入力がそこに表示されるかどうかを確認することです。

プログラム間のより多くの通信が予想される場合は、IPC「プロセス間通信」を検索して、より多くのアプローチを確認してください。

于 2012-04-24T15:54:06.260 に答える