我有一个在标准输出上打印的控制台应用程序。我想实现以下行为:
- 输出按回合打印(每回合后休息 2 秒)
- 用户可以(对他来说是可选的)按一个键开始打印其他数据
- 当用户不单击任何内容时,只会打印输出,不会发生任何变化
- 当用户单击预定义的键时(即使在打印输出期间他也可以这样做),应该调用一些函数
一开始我想过在其他线程中执行此操作(一个线程用于打印,一个线程用于等待输入),但我认为在这种情况下它没有用,因为不可能在线程中等待输入。
所以我找到了两个可能能够做到这一点的库:
- 简单快速的多媒体库 (SFML):http://www.sfml-dev.org/index.php
- ncurses:http://www.gnu.org/software/ncurses/ncurses.html
我对其中任何一个都不认识,所以我不确定我应该学习哪一个来实现目标。或者也许还有另一种更简单的解决方案?
操作系统: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/