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

时间:2012-04-23 17:50:20

标签: c# c++ io nonblocking

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

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

但是cin.get()是一个阻塞函数,如果我想让控制台应用程序运行到最后它不会在没有按下停止按钮的情况下关闭。有没有类似于cin.get()的函数实际上没有阻塞,或者可能是一种不同的方式将“任何键”从c#发送到我的控制台应用程序进程?

3 个答案:

答案 0 :(得分:0)

使用_getch()代替cin.get()。 它是一个阻塞命令,但只执行它if ( _kbhit() ) 它会立即返回。

答案 1 :(得分:0)

您可以尝试发送Ctrl+C to the console process来触发其中断行为。

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

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

如果您期望程序之间的更多通信搜索IPC“进程间通信”以查看更多方法。

答案 2 :(得分:0)

在这里找到一个非常简单的答案: Simple example of threading in C++。积分归Edward Kmett所有 我碰巧在c ++应用程序中使用boost库,所以我也可以使用boost thread实现。这很简单,这就是我的线程函数的样子:

bool stopped=false;

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

}  

以及后来的main.cpp:

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

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