【问题标题】:C How to terminate a thread blocked on ReadConsole()?C 如何终止在 ReadConsole() 上阻塞的线程?
【发布时间】:2016-04-27 20:16:37
【问题描述】:

我正在尝试终止在另一个线程的 ReadConsole() 调用中阻塞的线程。它不适用于 terminateThread(我知道这不是停止它的好方法),因为当重新启动该线程时,该线程仍然存在试图返回 ReadConsole()。我也尝试从另一个线程设置一个事件,在另一端等待它,但我仍然不知道如何停止它。

【问题讨论】:

  • 在提交阻塞函数之前找到一种获取状态的方法。我看了看但找不到类似的控制台功能,除了使用kbhit()的简单建议。
  • 我试过khbit,它立即返回。我必须从缓冲区中的控制台获取输入并通过套接字发送它
  • 当然可以——这就是重点。 kbhit 是非阻塞的,它会告诉您是否有一个键在输入缓冲区中等待,然后您就知道它不会阻塞了。同时,您可以检查线程是否应该关闭。
  • @mychemicalro 按键,读取结果,打印 ;)
  • CancelSynchronousIo 也可能是一个选项,但我不确定它是否适用于控制台 I/O。

标签: c windows multithreading


【解决方案1】:

有一种解决方案可以在 Windows 7 下运行,但我没有在更高版本的 Windows 中专门对其进行测试。

除了FreeConsole 在 Windows 7 下引发访问冲突之外,您还可以使用:

CloseHandle(GetStdHandle(STD_INPUT_HANDLE))

这会解除对ReadConsole 的阻止(无异常)。

您可以稍后使用CreateFile("\\\\.\\CON", ...) 重新打开控制台输入句柄。

注意:在尝试关闭之前,您必须检查句柄类型:GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多