многопоточность — C ++: чтение символов перед нажатием ENTER

Вот уже несколько часов я пытаюсь понять, как читать символы из cin перед нажатием ENTER (используя потоки). Я знаю о библиотеке 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;
}

РЕДАКТИРОВАТЬ:

Key-регистратор? Нет, я делаю консольный сетевой чат. В настоящее время сервер и клиент могут общаться друг с другом. Когда новое сообщение получено или отправлено, оно сохраняется в «векторе»<\ string> chat «и консоль обновляется под кодом:

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»), теряется на экране.

1

Решение

Чтобы сделать то, что вы хотите, вам нужно будет включить очередь сообщений и метод обновления.

Можете ли вы сделать это так, как вы представили? Конечно, но это будет серьезной болью, и нет никакого способа сделать это с помощью cin.

Просто создайте очередь сообщений с обеих сторон, текущий статус каждого клиента (able_to_receive_messages, неспособный и т. Д.) И метод обновления, который вызывается каждым клиентом, запускается после того, как пользователь снова сможет получать сообщения.

0

Другие решения

Других решений пока нет …