2017-01-01 3 views
1

Я хочу создать приложение/окно WinAPI, и поскольку я не хочу, чтобы мое выполнение блокировалось во время ожидания сообщений, я планировал иметь 2 потока; основной поток и поток приложений. Поток приложения создаст окно (CreateWindowEx), а затем заблокируется в контуре сообщения.Многопоточное приложение WinAPI

Мое затруднение исходит из основного потока, который хочет изменить часть приложения. Например, изменение стиля, размера и т. Д. Чтобы поддерживать приложение в потоковом режиме, я бы предположил, что лучше сохранить такой код в одном потоке. Моя первая идея - опубликовать сообщение из основного потока, чтобы поток приложений разблокировался и может обрабатывать запрос, а затем снова блокировать его. Однако я не уверен, что отправка сообщения из отдельного потока безопасна, и мне было трудно найти ответ на этот онлайн-ресурс. Могут также быть лучшие решения, которые я не рассматриваю. Буду признателен за любую помощь или отзывы.

+1

Для выполнения этих задач вам не нужно иметь 2 (или больше потоков) - одного потока более чем достаточно. использовать 'MsgWaitForMultipleObjectsEx' цикл басированных сообщений – RbMm

+2

Да, вы можете отправлять (или отправлять) сообщения между потоками. –

ответ

2

Отправка сообщения SendMessage и/или PostMessage по потокам безопасна и поддерживается.

SendMessage ожидает, пока другая нить обрабатывает сообщение, а PostMessage не ждет. Есть и другие различия между этими двумя, но главным, чтобы помнить в вашем случае является то, что вы не можете сделать

... 
if (whatever) 
{ 
    char buffer[100]; 
    strcpy(buffer, "hello world"); 
    PostMessage(g_MyWindow, WM_APP, 0, (LPARAM) buffer); // BUG, must use SendMessage 
} 
... 

, поскольку буфер может выйти за рамки, прежде чем другой поток обработал сообщение.

В целом, все функции Windows, которые имеют дело с окнами, такими как MoveWindow и GetWindowRect, являются потокобезопасными. Большинство из них также могут быть использованы на окнах в другом процессе ...

+0

Несколько примечаний: '1' В то время как технически потокобезопасные, оконные мутаторы всегда должны вызываться из потока, который создал окно. Это явно указано для [DestroyWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682.aspx), например. '2' Отправка сообщений через потоки должна выполняться с помощью' SendMessageTimeout' для предотвращения взаимоблокировок. '3' Пока' SendMessage' ожидает возвращения цели, она все равно будет отправлять входящие сообщения с перекрестными потоками. – IInspectable

+0

@Inspectable Да SendMessage для других потоков является рискованным, если цель не обрабатывает сообщения, но вы, как правило, только защищаете ее при работе с другими процессами, вы просто предполагаете, что ваш собственный код не содержит ошибок;) Отправка сообщения из рабочего потока на ваш Поток пользовательского интерфейса никогда не должен быть проблемой. – Anders

+0

Просто потому, что поток работает в вашем процессе, не означает, что это ваш код. – IInspectable

Смежные вопросы