【发布时间】:2015-07-07 12:06:55
【问题描述】:
我有一个非常简单的 Windows 控制台应用程序,它首先创建一个线程来处理标准输入上的输入。它使用main()中的CreateThread()创建线程,线程做的第一件事就是调用getchar()并阻塞,等待。
然后main()使用RegisterClass()注册一个窗口类并调用CreateWindowEx()创建一个不可见的消息窗口。
但是CreateWindowEx() 永远不会回来。
如果我删除线程中的getchar() 并将其替换为while (1) Sleep(1000);,一切正常。
如果我将Sleep(1000); 添加到线程函数的开头,CreateWindowEx() 调用会成功,但线程中的 I/O 会停止工作(getchar() 不会返回)。
为什么阻塞的第二个线程会干扰第一个线程?
【问题讨论】:
-
你的窗口过程发生了什么?你收到
WM_NC_CREATE了吗? -
窗口过程只调用 DefWindowProc() ,除非它是 WM_USER 消息,在这种情况下它会将其记录到文件中。如果我不在线程中调用 getchar() ,这将有效。我不知道是否正在向它发送 WM_NC_CREATE。
-
可以提供an MCVE吗?
标签: windows multithreading winapi io nonblocking