C++: Чтение символов перед нажатием ENTER

уже несколько часов я пытаюсь понять, как читать символы из cin, прежде чем нажимать ENTER (с помощью потоков). Я знаю о библиотеке conio.h, но предпочитаю ее не использовать.

Я написал простую программу, которая получает данные от пользователя и сохраняет их в строке «msg». Программа имеет дочерний поток, который очищает консоль каждую секунду. Что я хочу сделать, так это:

  1. Пользователь вводит некоторые данные, но не нажимает ENTER, поэтому они не сохраняются в переменной «msg».
  2. Консоль очищается
  3. отправить в cout введенные пользователем символы, чтобы он даже не заметил, что консоль была очищена.

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: ";
}

Таким образом, возникает проблема, если новое сообщение получено, когда пользователь пишет свое собственное сообщение. Часть сообщения, написанного до сообщения system("cls"), теряется на экране.


person John Doe    schedule 22.05.2013    source источник
comment
Для этого нет стандартных библиотечных функций C++. Вы должны использовать либо специфичный для ОС код (а не cin - но вы, вероятно, могли бы сделать что-то подобное, что работает для вас), либо использовать сторонние библиотеки (curses или подобные).   -  person Mats Petersson    schedule 22.05.2013
comment
Не знаю, почему вы пытаетесь это сделать. Вы пишете кейлоггер?   -  person Peter Wood    schedule 22.05.2013
comment
Кроме того, использование cin из более чем одного потока почти наверняка приведет к всевозможным плохим последствиям.   -  person Mats Petersson    schedule 22.05.2013
comment
@UP Я пишу не кейлоггер, а программу чата. Только что отредактировал пост.   -  person John Doe    schedule 22.05.2013


Ответы (1)


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

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

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

person Captain Skyhawk    schedule 22.05.2013