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-logger? Не, правя конзолен мрежов чат. В момента сървърът и клиентът могат да разговарят помежду си. Когато се получи или изпрати ново съобщение, то се записва във „vector‹\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"), се губи на екрана.


person John Doe    schedule 22.05.2013    source източник
comment
Няма стандартни C++ библиотечни функции за това. Трябва да използвате или специфичен за ОС код (а не cin - но вероятно бихте могли да направите нещо подобно, което работи за вас), или да използвате библиотеки на трети страни (curses или подобни).   -  person Mats Petersson    schedule 22.05.2013
comment
Не знам защо се опитвате да направите това. Пишете ли key logger?   -  person Peter Wood    schedule 22.05.2013
comment
Освен това използването на cin от повече от една нишка почти сигурно ще причини всякакви лоши неща.   -  person Mats Petersson    schedule 22.05.2013
comment
@UP Не пиша key logger, а програма за чат. Току що редактирах публикацията.   -  person John Doe    schedule 22.05.2013


Отговори (1)


За да направите това, което искате, ще трябва да включите опашка от съобщения и метод за актуализиране.

Можете ли да го направите по начина, по който сте го представили? Разбира се, но това ще бъде голяма болка и няма начин да се направи това с cin.

Просто имайте опашка със съобщения от двете страни, текущо състояние на всеки клиент (able_to_receive_messages, unable и т.н.) и метод за актуализиране, който се извиква от всеки клиент, се изпълнява, след като потребителят отново може да получава съобщения.

person Captain Skyhawk    schedule 22.05.2013