非阻塞IO函数而不是cin.get()
non-blocking io function instead of cin.get()
我有一个 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#发送到我的控制台应用程序进程的不同方式?
使用 _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(我不知道这是否是错误的,因为我不知道程序何时结束,如果我留下僵尸线程...也许有人可以启发我)。
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 使用 cin.get() 初始化字符数组
- 编写 cin.get() 以接收字符数组时出现问题
- 使用 cin.get 读取字符数组
- cin.get()的返回类型
- 在循环中使用 cin.get() 输入字符串
- 为什么 cin.get(char, int) 不会溢出?
- cin.get() 导致"no instance of overloaded function"错误
- 为什么当我输入字符时,这个特定的 cin.get() 语句在C++中不起作用?
- 为什么程序在 cin 之后跳过 cin.get()?
- 如何终止 std::cin.get() 的 ''
- 使用 cin.get() 读取字符
- 无法让我了解 cin.get 和 cout 在这里的工作方式
- cin.get()函数在C 中
- 如何在 c++ 中使用 cin.get() 给出更多数字?
- (m = cin.get())!=EOF&m = cin.get()!=EOF 之间的差异
- 为什么我的应用程序即使我的应用程序也关闭,即使我有cin.get();
- C 使用CIN.Get()暂停此程序
- cin.get() 之后的回车;C++
- 我是否缺少 cin.get() 的东西