Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ n、 我认为这可能有点过分了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您_C++_Console - Fatal编程技术网

C++ n、 我认为这可能有点过分了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您

C++ n、 我认为这可能有点过分了。另一方面,如果您希望捕捉非常特定的按键(例如箭头键或其他不产生文本输入的键)或处理鼠标,则ncurses将帮助您,c++,console,C++,Console,另一个流行且轻量级的选择是SDL(及其SDL_输入库)。与之前的解决方案不同,它完全面向输入。它将允许您以非阻塞的方式捕捉击键、鼠标单击以及可能的其他非常详细的输入事件。然而,您通常将libsdl作为一个整体安装,尽管它很小,但我不确定您的应用程序的所有用户是否都会喜欢它。嗯,除非他们使用通常使用SDL的游戏 最后,你可以自己实现这样一件简单的事情。如果您只关心*nix(而不关心Windows等系统的可移植性),可以将stdin设置为非阻塞模式,并在主循环中使用重复的非阻塞读取来检查按键。如果应

另一个流行且轻量级的选择是SDL(及其SDL_输入库)。与之前的解决方案不同,它完全面向输入。它将允许您以非阻塞的方式捕捉击键、鼠标单击以及可能的其他非常详细的输入事件。然而,您通常将libsdl作为一个整体安装,尽管它很小,但我不确定您的应用程序的所有用户是否都会喜欢它。嗯,除非他们使用通常使用SDL的游戏

最后,你可以自己实现这样一件简单的事情。如果您只关心*nix(而不关心Windows等系统的可移植性),可以将
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;
}