Кажется, лучший способ инициировать создание окна из основного потока, в то время как обработка сообщений для них в отдельном циклическом потоке - это использование настраиваемого сообщения, которое может быть отправлено в отдельный поток. окно, но все же позволяющее вызывать это действие из исходного потока:
1) Выделите пользовательское сообщение и создайте структуру для хранения параметров инициализации окна:
message_create_window = WM_USER + 0;
class Message_create_window{
Message_create_window(...);
};
2) Вместо вызова CreateWindow
(Ex) используйте что-то похожее на следующее, передавая параметры создания соответствующего окна:
PostThreadMessage(
thread.id,
message_create_window,
new Message_create_window(...),
0
);
3) Обработайте пользовательское сообщение в насосе сообщений вашей цепочки обработки пользовательского интерфейса, извлеките параметры создания, а затем освободите:
MSG msg;
GetMessage(&msg,0,0,0);
...
switch(msg->message){
...
case message_create_window:{
Message_create_window *data=msg->wParam;
CreateWindowEx(data->...);
delete data;
}break;
...
Это, однако, имеет следующие побочные эффекты:
- Окно будет создано асинхронно. Если требуется, чтобы начальный блок потока до тех пор, пока не было создано окно (или, действительно, существование окна когда-либо может быть подтверждено), то должен использоваться инструмент синхронизации потока (такой как событие)
- Следует соблюдать осторожность при взаимодействии с окном (в конце концов, это многопоточное приложение)
Если в этом ответе есть серьезные пробелы или это кажется ужасным подходом, пожалуйста, исправьте меня.
(Это все еще мой вопрос, и я пытаюсь найти лучший способ сделать это)