Мне нужны отзывы по проблеме, которую я могу обойти, но хочу лучше понять.У меня есть несколько многопоточных кода, где рабочий поток использует функцию PostMessage API Win32, чтобы опубликовать сообщение в основной поток пользовательского интерфейса для обновления TreeView.Некоторые из опубликованных сообщений иногда не отображаются через поток сообщений в потоке пользовательского интерфейса, несмотря на то, что мои записи в журнале показывают, что сообщение PostMessage вернулось успешно.
Я уже нашел множество объяснений того, как это могло произойти, если бы я это сделалчто-то странное в моей рассылке сообщений, из-за присутствия модальной рассылки сообщений в определенных обстоятельствах, но я не делаю ничего прикольного.
Я думаю (но хотел бы подтвердить), что моя проблема связана с вызовомPostMessage слишком рано в жизни потока пользовательского интерфейса.Мой WinMain вызывает CreateWindowEx для создания своего главного окна, и обработчик WM_CREATE для этого окна косвенно запускает фоновые потоки, которые довольно быстро будут вызывать PostMessage, используя HWND главных окон, возможно, даже до того, как обработчик WM_CREATE завершит работу, весьма вероятно, до прокачки сообщений WinMain
Возможно / вероятно, что некоторые сообщения в этой ситуации будут потеряны, даже если PostMessage вернул успех?В ходе тестирования я определил, что добавления небольшой задержки (Sleep (50)) в рабочий поток перед вызовом PostMessage достаточно для предотвращения потери сообщений.Однако я не уверен, что это решает основную проблему, поэтому хотел бы знать, нужно ли мне продолжать копать.
РЕДАКТИРОВАТЬ:
Во всем моем коде есть только один цикл сообщений ион не делает ничего необычного, кроме вызова обычного TranslateAccelerator и т. д .:
// Enter the message loop
while (GetMessage (&msg, NULL, 0, 0)) {
if (!TranslateMDISysAccel(hwndClient, &msg) && !TranslateAccelerator (hwndFrame, hAccel, &msg)) {
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}