【问题标题】:C# console window problem with _getch()_getch() 的 C# 控制台窗口问题
【发布时间】:2010-08-10 20:37:32
【问题描述】:

我使用 С# 在我的 Windows 应用程序表单中嵌入了一个控制台窗口

我有一个在控制台窗口中运行的应用程序。我的 c# 项目是一个 GUI,用于显示其输出并向其发送参数。

大多数工作正常,除非从我的 GUI 向控制台窗口调用 _getch() 时,它往往会冻结整个系统。

有人知道为什么会发生这种情况吗?

如果需要,我可以发布代码。

谢谢

【问题讨论】:

    标签: c# console


    【解决方案1】:

    很可能_getch() 是一个阻塞调用。

    【讨论】:

    • 你知道我有什么办法可以从 Windows 申请表中克服这个问题吗?
    【解决方案2】:

    在用户按下键盘上的键入键之前,_getch() 函数不会返回。如果从程序的主线程调用此函数,那么这将停止 UI 线程。它不会泵送消息循环,当它不再处理输入事件或绘制窗口时,您的 UI 会冻结。几秒钟后,Windows 会在标题栏中显示“未响应”的幽灵窗口。

    虽然从后台线程调用 _getch() 可以解决问题,但这可能并不方便。您可以使用 _kbhit() 检查击键是否可用。在 _kbhit() 返回 true 后调用 _getch() 不会阻塞。估计也不方便。在 _kbhit() 返回 false 时尝试抽出消息循环从技术上讲是一种解决方案,如果不是因为消息循环存在于错误的代码中。

    请注意,您可以在控制台窗口中键入 Ctrl+S 来暂停输出,Ctrl+Q 会再次恢复。你仍然会阻塞 UI 线程,但至少你会在知情的情况下这样做。

    【讨论】:

    • Hans Passant 那里有很好的信息,非常感谢您的回复 :)
    【解决方案3】:

    _getch() 是做什么的。如果它阻塞了 UI 线程,您可以在另一个线程中启动调用。

    【讨论】:

    • _getch() 将从命令提示符中读取击键。问题是,我有一个我编写的用于命令提示符的程序。它可以 100% 工作。但是当我通过在 Windows 窗体应用程序中嵌入命令提示符来尝试通过我在 Visual Studio 中设计的 GUI 来使用它时。它挂起,但所有其他功能都有效。那么有什么想法可以从我的 GUI 中处理吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2019-01-18
    • 2014-03-29
    • 1970-01-01
    • 2017-07-06
    • 2012-09-04
    相关资源
    最近更新 更多