Вот уже несколько часов я пытаюсь понять, как читать символы из cin перед нажатием ENTER (используя потоки). Я знаю о библиотеке conio.h, но предпочитаю не использовать ее.
Я написал простую программу, которая получает данные от пользователя и сохраняет их в строке «msg». Программа имеет дочерний поток, который очищает консоль каждую секунду. Что я хочу сделать, это:
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»), теряется на экране.
Чтобы сделать то, что вы хотите, вам нужно будет включить очередь сообщений и метод обновления.
Можете ли вы сделать это так, как вы представили? Конечно, но это будет серьезной болью, и нет никакого способа сделать это с помощью cin.
Просто создайте очередь сообщений с обеих сторон, текущий статус каждого клиента (able_to_receive_messages, неспособный и т. Д.) И метод обновления, который вызывается каждым клиентом, запускается после того, как пользователь снова сможет получать сообщения.
Других решений пока нет …