3

我有一个 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# 向我的控制台应用程序进程发送“任何密钥”的不同方式?

4

3 回答 3

0

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

于 2012-04-24T13:03:40.137 回答
0

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

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

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

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

于 2012-04-24T15:54:06.260 回答
0

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

bool stopped=false;

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

}  

后来在 main.cpp 中:

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

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

于 2012-04-25T10:10:11.520 回答