c++ - 用于键盘异步输入的库

标签 c++ console

我有一个在标准输出上打印的控制台应用程序。我想实现以下行为:

  • 输出按回合打印(每回合后休息 2 秒)
  • 用户可以(对他来说是可选的)按一个键开始打印其他数据
  • 当用户不单击任何内容时,只会打印输出,不会发生任何变化
  • 当用户单击预定义的键时(即使在打印输出期间他也可以这样做),应该调用一些函数

一开始我想过在其他线程中执行此操作(一个线程用于打印,一个线程用于等待输入),但我认为在这种情况下它没有用,因为不可能在线程中等待输入。

所以我找到了两个可能能够做到这一点的库:

我对其中任何一个都不认识,所以我不确定我应该学习哪一个来实现目标。或者也许还有另一种更简单的解决方案?

操作系统:Unix

编辑: g-makulik 让我展示,为什么不可能使用线程来编写,坚持认为这是可能的,而且确实是这样,但我不认为这是它应该是什么样子:

#include <pthread.h>
#include <iostream>
#include <string>
#include <stdio.h>

void* print_message_function(void *doPrint) {
    bool* vDoPrint = (bool*) doPrint;
    while (*vDoPrint) {
        sleep(0.5);
        std::cout << "Thread 1" << std::endl;
    }
    return NULL;
}

void* keyPressed(void* doPrint) {
    bool* vDoPrint = (bool*) doPrint;
    while (*vDoPrint) {
        *vDoPrint = (char) getchar() == 'k' ? false : true;
        std::cout << "THIS ISN'T DISPLAYED UNLESS 'k' PRESSED.";
    }
    return NULL;
}

int main(int argc, char* argv[]) {
    pthread_t thread1, thread2;
    int iret1, iret2;
    bool doPrint = true;
    iret2 = pthread_create(&thread2, NULL, print_message_function,
            (void*) &doPrint);
    iret1 = pthread_create(&thread1, NULL, keyPressed,
            (void*) &doPrint);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    std::cout << "Thread 1 returns: " << iret1 << std::endl;
    std::cout << "Thread 2 returns: " << iret2 << std::endl;
    return 0;
}

最佳答案

可以等待一个线程的键盘输入,同时另一个线程输出到同一控制台。您只需要同步线程(输入/输出)即可根据用户输入获取功能(例如使用事件队列)。

编辑: 在提供这些系统调用的系统上,使用带有超时的 select()epoll() 而不是单独的线程可能是更好的选择。

ncurses 库将使您能够以类似窗口的方式组织控制台显示(例如,具有单独的面板来显示输出并具有某种命令(行)输入)。请参阅Midnight Commander对于高级示例,ncurses 能够执行哪些操作。

但只要您不关心应用程序中回显输入的这种分离,输入和输出的简单线程分离就可以正常工作。

我无法透露有关 SMFL 的任何信息,但该库似乎支持图形级别而不是控制台上的窗口。

关于c++ - 用于键盘异步输入的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078592/

相关文章:

python - 如何使用 Python Click 的多个命令组设置控制台脚本的入口点?

C++:重新使用打印到控制台的行

javascript - 在控制台使用 jQuery?

c++ - 带有 Boost 的可注释控制流图?

python - Crypto++ 和 Python 之间的 Diffie-Hellman key 交换

C++ .length() 函数给出错误的结果

java - 如何用 JLine 编写等效的 KeyListener?

lib中的Ruby gems - 备胎原理

c++ - Cmake:如何将库标记为依赖于系统库

c++ - 如何查找两条线的点积 (Opencv)