2

私は 2 つのスレッドを持っています: そのうちの 1 つは常にコンソールに何らかの値を出力しています。たとえば、毎秒 int 値をインクリメントするとします。つまり、コンソールの毎秒は 1,2,3 などです。

別のスレッドが、コマンド cin によるユーザー入力を待っています。

ここに私の問題があります: 何かを入力し始めると、int 値を計算するときが来て、入力フィールドから入力が消去され、int 値でコンソールに入力されます。したがって、「こんにちは」と入力したい場合は、次のようになります。

1
2
3
he4
l5
lo6
7
8

他のスレッドがコンソールに書き込んでいる間に、自分の入力がコンソールに送られないようにする方法はありますか?

参考までに、これはクライアント側のチャット アプリに必要です。一方のスレッドはメッセージをリッスンし、受信するとすぐにこのメッセージを出力し、もう一方のスレッドはサーバー アプリに送信されるユーザー入力をリッスンします。

4

6 に答える 6

1

通常、端末自体が入力されたキーをエコーし​​ます。これをオフにして、プログラムにエコーさせることができます。この質問は、それを行う方法についての指針を提供します端末でのパスワード入力を非表示にします

その後、出力を処理するスレッドを 1 つだけ取得できます。

于 2013-08-10T09:48:02.520 に答える
0

他のスレッドがコンソールに書き込んでいる間に、自分の入力がコンソールに送られないようにする方法はありますか?

それは逆です。他のスレッドは、入力中の表示を中断してはなりません。

「Hel」と入力した後、別のスレッドから新しいメッセージが届いたとします。職業はなんですか?どのように表示すればよいですか?

  1. 入力内容のエコーを完全に無効にし、Enter キーを押した後にのみ表示します。このようにして、アトミックな方法で、異なるスレッドからのメッセージを適切に表示できます。大きな欠点は、すでに入力したものが見えないことです... :(

  2. 入力した内容をすぐにエコーします。新しいメッセージが届いたら、「Hel」を元に戻し、新しいメッセージを出力して、新しい行に「Hel」を再度出力すると、入力を続けることができます。実行可能ですが、少し醜いです。

  3. 入力した内容を別の場所にエコーします。つまり、何らかの方法で表示を分割します。1 つの場所で、投稿/受信メッセージを順番に表示します。別の場所に、入力しているものを表示します。これを行うには、GUI または少なくともいくつかのコンソール ライブラリが必要です。これは最も優れたソリューションですが、ライブラリの依存関係のために別の OS に移植するのがおそらく最も困難です。

いずれにせよ、異なるスレッドから安全に呼び出すことができ、原子的に文字列を書き込むことができる(できれば内部的に) 同期されたストリームが必要です。つまり、独自の同期ストリーム クラスを作成する必要があります。

お役に立てれば。

于 2013-08-10T12:18:25.533 に答える
0

この問題はセマフォで解決できると思います。受信メッセージがある場合、ユーザーが何かを書いているかどうかを確認します。もしそうなら、彼がメッセージの印刷を終えるまで待ってください。

于 2013-08-10T09:56:40.967 に答える