非阻塞IO函数而不是cin.get()

本文关键字:cin get IO 函数 | 更新日期: 2023-09-27 18:32:04

我有一个 c++ 控制台应用程序,它有一个选项可以通过按任何键来中断(通过使用 kbhit() 实现),在这种情况下,它会打印它所做的并退出(或者可以留下来完成工作(一些录音)并仍然打印反馈)。我正在为该控制台应用程序制作一个 c# gui 应用程序(我正在从 c# 表单调用 exe 文件),而不是按键盘上的任何键,我使用"停止"按钮将 Environment.NewLine(或"'")发送到重定向的输入,在 c++ 应用程序中,我现在必须使用与 kbhit() 不同的东西才能工作。我尝试使用cin.get(),例如:

if (kbhit() || (cin.get() > 0))  
    stop_recording=true;  

但是cin.get()是一个阻塞函数,如果我希望控制台应用程序运行到最后,如果不按停止按钮,它就不会关闭。是否有任何类似于cin.get()的函数实际上没有阻塞,或者可能是将"任何密钥"从c#发送到我的控制台应用程序进程的不同方式?

非阻塞IO函数而不是cin.get()

使用 _getch() 而不是 cin.get() 。这是一个阻止命令,但执行它只会if ( _kbhit() )它将立即返回。

可以尝试将 Ctrl+C 发送到控制台进程以触发其中断行为。

如果需要继续,可以检查命名同步对象 - 即在UI进程中创建命名的互斥/信号量(具有随机名称)并将此名称传递给控制台进程。控制台进程会偶尔检查一次(而不是 kbhit),它是否仍然可以获取互斥/信号量,并在不再能够时停止。

@Komyg建议的另一个选项是将一个线程专用于阅读控制台,并检查特定输入是否显示在那里。

如果您希望程序之间有更多的通信,请搜索IPC"进程间通信"以查看更多方法。

在这里找到了一个非常简单的答案:C++ 中线程的简单示例。学分归爱德华·凯米特所有。
我碰巧在 c++ 应用程序中使用了 boost 库,所以我也可以使用 boost 线程实现。这很简单,这就是我的线程函数的样子:

bool stopped=false;
void inputSent() //
{  
    if (kbhit() || (cin.get() > 0))  
        stopped=true;  
}  

后来在主.cpp:

boost::thread stoppedThread = boost::thread(inputSent);  

之后,我只是检查是否停止==true,并且我没有使用stopThread.join(我不知道这是否是错误的,因为我不知道程序何时结束,如果我留下僵尸线程...也许有人可以启发我)。