C ++:在按ENTER之前读取字符

时间:2013-05-22 12:22:30

标签: c++ multithreading cin conio

现在几个小时,我试图找出如何在按下ENTER之前从cin读取字符(通过使用线程)。我知道conio.h库但我不想使用它。

我写了一个简单的程序,它从用户那里获取数据并将其保存在'msg'字符串中。程序有子线程,每秒清除控制台。我想做的是:

  1. 用户放置一些数据但不按ENTER键,因此它不会保存在'msg'变量中。
  2. 控制台清除
  3. 向cout发送用户输入的字符,因此他甚至不会注意到控制台已被清除。
  4. 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&lt; \ string&gt; 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 个答案:

答案 0 :(得分:0)

要执行您想要的操作,您需要合并消息队列和更新方法。

你能按照你提出的方式去做吗?当然,但这将是一个巨大的痛苦,并且没有办法用cin做到这一点。

只需在两端都有一个消息队列,每个客户端的当前状态(able_to_receive_messages,无法等),并且在用户再次能够接收消息之后运行每个客户端调用的更新方法。 / p>