1

数時間ほど前から、Enter キーを押す前に (スレッドを使用して) cin から文字を読み取る方法を見つけようとしています。conio.h ライブラリについては知っていますが、使用したくありません。

ユーザーからデータを取得して「msg」文字列に保存する簡単なプログラムを作成しました。プログラムには、毎秒コンソールをクリアする子スレッドがあります。私がやりたいことは次のとおりです。

  1. ユーザーがデータを入力しましたが、ENTER を押さなかったため、'msg' 変数に保存されませんでした。
  2. コンソールのクリア
  3. ユーザーが入力した文字を送信するため、コンソールがクリアされたことに気付かない.

PS。私の英語で申し訳ありませんが、プログラムは次のとおりです。

#include<iostream>
#include<string>
#include<winsock2.h>
#include<process.h> 
#include<windows.h>
using namespace std;


void __cdecl ThreadProc( void * Args )
{

    while( true ){
        system("cls");
        cout << "Input: ";
        /*
        char c;
        while((c=cin.peek()) != '\n')
            cin.get(c);
        cout << c;
        */
        Sleep(1000);
    }
    _endthread();
}


int main(){
    HANDLE hThread =( HANDLE ) _beginthread( ThreadProc, 0, NULL );

    while (true){
        string msg;
        getline(cin,msg);
        cout << "MSG:" << msg << endl;
        cin.clear();
        fflush(stdin);
    }
    return 0;
}

編集:

キーロガー?いいえ、コンソール ネットワーク チャットを行っています。現在、サーバーとクライアントは互いにチャットできます。新しいメッセージが受信または送信されると、「vector<\string> チャット」に保存され、コードの下でコンソールが更新されます。

void show_chat(){
    system("cls");
    for(unsigned int i =0;i<chat.size();i++){
        cout << "[" << date[i].tm_hour << ":" << date[i].tm_min << ":" << date[i].tm_sec << "] " << chat[i] << endl;
    }
    cout << "Input: ";
}

そのため、ユーザーが自分のメッセージを書いているときに新しいメッセージを受信すると問題が発生します。メッセージ システム ("cls") の前に書き込まれたメッセージの一部が画面上で失われます。

4

1 に答える 1

0

必要なことを行うには、メッセージ キューと update メソッドを組み込む必要があります。

提示された方法でできますか?確かに、しかしそれは大きな苦痛になるだろうし、cin でこれを行う方法はありません.

両側にメッセージ キューを配置し、各クライアントの現在のステータス (able_to_receive_messages、unable など) を設定し、ユーザーがメッセージを再び受信できるようになった後に各クライアントによって呼び出される更新メソッドを実行します。

于 2013-05-22T12:53:32.650 に答える