我有一个在标准输出上打印的控制台应用程序。我想实现以下行为:
- 输出一圈打印(每圈后休息 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;
}