C++ n、 我认为这可能有点过分了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您
另一个流行且轻量级的选择是SDL(及其SDL_输入库)。与之前的解决方案不同,它完全面向输入。它将允许您以非阻塞的方式捕捉击键、鼠标单击以及可能的其他非常详细的输入事件。然而,您通常将libsdl作为一个整体安装,尽管它很小,但我不确定您的应用程序的所有用户是否都会喜欢它。嗯,除非他们使用通常使用SDL的游戏 最后,你可以自己实现这样一件简单的事情。如果您只关心*nix(而不关心Windows等系统的可移植性),可以将C++ n、 我认为这可能有点过分了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您,c++,console,C++,Console,另一个流行且轻量级的选择是SDL(及其SDL_输入库)。与之前的解决方案不同,它完全面向输入。它将允许您以非阻塞的方式捕捉击键、鼠标单击以及可能的其他非常详细的输入事件。然而,您通常将libsdl作为一个整体安装,尽管它很小,但我不确定您的应用程序的所有用户是否都会喜欢它。嗯,除非他们使用通常使用SDL的游戏 最后,你可以自己实现这样一件简单的事情。如果您只关心*nix(而不关心Windows等系统的可移植性),可以将stdin设置为非阻塞模式,并在主循环中使用重复的非阻塞读取来检查按键。如果应
stdin
设置为非阻塞模式,并在主循环中使用重复的非阻塞读取来检查按键。如果应用程序在循环迭代之间的等待时间比实际处理时间长,那么最好使用select()
来处理延迟和等待输入
我会因为这个原因而避免引入线程,因为它们效率低下,并且通常会引入比解决问题更多的问题。如果非阻塞I/O是可行的,就不应该使用线程阻塞I/O。SFML是我以前从未听说过的东西。我不能说这是一个不好的选择,但这是一个相当不受欢迎的选择,因此它很可能是你的程序的用户将不得不安装它只是为了它。我不会走那条路
ncurses是一个非常常见且很好的解决方案,但我认为它对于您的案例来说太复杂了。当您进行更复杂的文本I/O时,例如在屏幕上绘图、组装窗口、处理鼠标等,ncurses非常方便。对于这样一个简单的应用程序,我认为这可能有点过头了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您
另一个流行且轻量级的选择是SDL(及其SDL_输入库)。与之前的解决方案不同,它完全面向输入。它将允许您以非阻塞的方式捕捉击键、鼠标单击以及可能的其他非常详细的输入事件。然而,您通常将libsdl作为一个整体安装,尽管它很小,但我不确定您的应用程序的所有用户是否都会喜欢它。嗯,除非他们使用通常使用SDL的游戏
最后,你可以自己实现这样一件简单的事情。如果您只关心*nix(而不关心Windows等系统的可移植性),可以将stdin
设置为非阻塞模式,并在主循环中使用重复的非阻塞读取来检查按键。如果应用程序在循环迭代之间的等待时间比实际处理时间长,那么最好使用select()
来处理延迟和等待输入
我会因为这个原因而避免引入线程,因为它们效率低下,并且通常会引入比解决问题更多的问题。如果非阻塞I/O是可行的,则永远不要使用线程阻塞I/O。为什么您认为“在线程中等待输入是不可能的”?当然,您可以在主线程中等待输入,然后从另一个线程执行输出,反之亦然。标准输出上打印一个线程。正确,但我应该如何在其他线程中等待输入?我应该简单地使用getchar()来处理另一个线程吗?控制台正在忙着打印,为什么我能按这个键呢?我认为它不是那么简单,我需要做的是获得一个监视器(Java名称),然后尝试编写。这也将保持同步。你只是尝试了一下吗?通常,让一个线程从(等待)
cin
读取,而另一个线程输出到cout
不会有问题。不过,如果输入需要回显,则用户的显示会有点混乱。但只要它只是对getchar
的一种反应,并且以菜单式的方式按下一个键,就不会有问题(即使需要使用enter键发送输入也可以)。我现在正在尝试。我以前尝试过,但没有成功的信心,所以我很快就放弃了。为什么你认为“在线程中等待输入是不可能的”?当然,您可以在主线程中等待输入,然后从另一个线程执行输出,反之亦然。标准输出上打印一个线程。正确,但我应该如何在其他线程中等待输入?我应该简单地使用getchar()来处理另一个线程吗?控制台正在忙着打印,为什么我能按这个键呢?我认为它不是那么简单,我需要做的是获得一个监视器(Java名称),然后尝试编写。这也将保持同步。你只是尝试了一下吗?通常,让一个线程从(等待)cin
读取,而另一个线程输出到cout
不会有问题。不过,如果输入需要回显,则用户的显示会有点混乱。但只要它只是对getchar
的一种反应,并且以菜单式的方式按下一个键,就不会有问题(即使需要使用enter键发送输入也可以)。我现在正在尝试。我以前试过,但没有成功的信心,所以我很快就放弃了。
#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;
}