【发布时间】:2010-08-10 20:37:32
【问题描述】:
我使用 С# 在我的 Windows 应用程序表单中嵌入了一个控制台窗口
我有一个在控制台窗口中运行的应用程序。我的 c# 项目是一个 GUI,用于显示其输出并向其发送参数。
大多数工作正常,除非从我的 GUI 向控制台窗口调用 _getch() 时,它往往会冻结整个系统。
有人知道为什么会发生这种情况吗?
如果需要,我可以发布代码。
谢谢
【问题讨论】:
我使用 С# 在我的 Windows 应用程序表单中嵌入了一个控制台窗口
我有一个在控制台窗口中运行的应用程序。我的 c# 项目是一个 GUI,用于显示其输出并向其发送参数。
大多数工作正常,除非从我的 GUI 向控制台窗口调用 _getch() 时,它往往会冻结整个系统。
有人知道为什么会发生这种情况吗?
如果需要,我可以发布代码。
谢谢
【问题讨论】:
很可能_getch() 是一个阻塞调用。
【讨论】:
在用户按下键盘上的键入键之前,_getch() 函数不会返回。如果从程序的主线程调用此函数,那么这将停止 UI 线程。它不会泵送消息循环,当它不再处理输入事件或绘制窗口时,您的 UI 会冻结。几秒钟后,Windows 会在标题栏中显示“未响应”的幽灵窗口。
虽然从后台线程调用 _getch() 可以解决问题,但这可能并不方便。您可以使用 _kbhit() 检查击键是否可用。在 _kbhit() 返回 true 后调用 _getch() 不会阻塞。估计也不方便。在 _kbhit() 返回 false 时尝试抽出消息循环从技术上讲是一种解决方案,如果不是因为消息循环存在于错误的代码中。
请注意,您可以在控制台窗口中键入 Ctrl+S 来暂停输出,Ctrl+Q 会再次恢复。你仍然会阻塞 UI 线程,但至少你会在知情的情况下这样做。
【讨论】:
_getch() 是做什么的。如果它阻塞了 UI 线程,您可以在另一个线程中启动调用。
【讨论】: