【发布时间】:2015-10-02 07:36:56
【问题描述】:
我有一个多线程的 Windows 控制台应用程序,其控制线程运行这样的用户输入循环:
char c;
do {
cin >> c;
// Alter activity based on c
} while(c != 'q')
// Tell other threads to close, .join(), and do cleanup
但是在某个时间我希望程序本身能够优雅地退出。最明显的方法是将"q\n" 放到标准输入流中。有没有合理的方法来做到这一点?
或者作为回调强制退出主控制循环(在主线程上)以便程序进入后续清理方法的好选择?
(到目前为止,我发现的最接近的是this,它需要生成一个子进程,充其量看起来像是笨拙的矫枉过正。)
【问题讨论】:
-
安装 signal handler 并处理 CTRL-C 事件。
-
添加另一个标志,并异步轮询标准输入?使用 POSIX 信号?使用 Windows 消息和其他原生 Windows 功能?使用其他synchronization?
-
或者使用
ReadConsole()或者ReadConsoleInfo()代替cin,那么你可以使用CreateEvent()创建一个事件对象并使用WaitForMultipleObjects()等待控制台输入和事件对象在同时。等待的结果会告诉你哪个是信号。然后,您可以在需要终止循环时发出事件信号,并仅在有内容可供读取时从控制台读取。 -
我认为@CaptainObvlious 的想法看起来最直接。当然,结果比预期的要复杂,但你可以自己判断:实现在我下面的答案中。
标签: c++ multithreading process stdin