У меня очень простое консольное приложение Windows, которое сначала создает поток для обработки ввода на stdin. Он использует CreateThread()
в main()
, чтобы создать поток, и первое, что делает поток, - это позвонить getchar()
и заблокировать, ожидая.Почему заблокированный IO в другом потоке не позволяет CreateWindowEx() возвращать
Затем main()
регистрирует класс окна с использованием RegisterClass()
и вызывает CreateWindowEx()
для создания невидимого окна сообщения.
НО CreateWindowEx()
не возвращается.
Если я удалю getchar()
в нити и замените его while (1) Sleep(1000);
, все будет работать.
Если я добавлю Sleep(1000);
в начало функции потока, вызов CreateWindowEx()
завершается успешно, но тогда вводе/выводе в потоке перестает работать (getchar()
не возвращается).
Почему заблокированная вторая нить мешает первой?
Что происходит в вашей процедуре окна? Получаете ли вы 'WM_NC_CREATE'? –
Процедура окна просто вызывает DefWindowProc(), если это сообщение не является WM_USER, и в этом случае оно регистрирует это в файле. Это работает, если я не вызываю getchar() в потоке. Я не знаю, отправляется ли ему WM_NC_CREATE. – Nicholas
Можете ли вы предоставить [MCVE] (http://stackoverflow.com/help/mcve)? –