Ваши сообщения будут там.Я не уверен, почему вы думаете, что PostMessage не гарантированно работает - это так.(РЕДАКТИРОВАТЬ: Предполагая, что PostMessage () возвращает TRUE! Проверьте ваши коды возврата!)
Вы хотите избежать использования очереди для передачи данных между потоками.Любая очередь, к которой получают доступ оба потока, должна быть защищена.Добавление жестких блокировок с обеих сторон приведет к сериализации вашего приложения.
Вместо этого создайте структуру данных в куче, используя new
, которая содержит ваши данные, затем скажите другому потоку: «У меня есть данные для вас, ивот."Затем принимающий поток становится владельцем этого указателя данных и отвечает за его использование.Делая это таким образом, нет жестких замков.
Теперь единственная хитрость заключается в том, чтобы выяснить, что сказать другому потоку, но это тоже легко.
Если вы отправляете данные из рабочего потока в основной поток, просто используйте PostMessage()
:
worker_thread_proc()
{
// ..
// Create the data object you're going to pass to the MT
MyData* data = new MyData;
data->some_value_ = "foo";
// Pass it:
PostMessage(main_wnd, WM_YOU_HAVE_DATA, reinterpret_cast<WPARAM>(data), 0);
}
... основной поток обрабатывает это, а затем удаляет данные:
MainWnd::OnYouHaveData(WPARAM wp, LPARAM)
{
std::auto_ptr<MyData> data(reinterpret_cast<MyData*>(wp));
my_widget->set_text(data->some_value_); // you get the idea
}
Если вы беспокоитесь о пользовательских сообщениях внешних приложений, сталкивающихся с вашими, вы можете заставить Windows дать вам уникальный идентификатор сообщения, используя RegisterWindowsMessage () - ваша единственная задачаздесь выбирается правильное имя для вашего сообщения.
Если вы отправляете данные из основного потока в рабочий поток, вы можете сделать то же, что и выше, за исключением того, что вместо использования PostMessage()
вы отправляете данные черезВы можете использовать QueueUserAPC () (чтобы убедиться, что ваш рабочий находится в состоянии ожидания с предупреждением - прочитайте примечания в связанных документах) или PostThreadMessage () .
РЕДАКТИРОВАТЬ:
По вашим комментариям в OP, теперь я понимаю, почему вы обеспокоены тем, что PostMessage () не работает.
Да, существует жесткое ограничение для Windowsразмер очереди сообщений.По умолчанию в очереди может быть только 4000 сообщений.(в настройках реестра можно настроить максимум до 10 000).
Если очередь заполнена, любой вызов PostMessage()
завершится ошибкой с кодом ошибки.Когда вы проверяете GetLastError () (я не помню, какой код ошибки он возвращает прямо сейчас), станет ясно, что очередь сообщений заполнена.
Не похоже на наседку, но вам действительно нужнопроверьте ваши возвращаемые значения от вызовов API.Но помимо этого, если вы работаете в потолке очереди сообщений, я бы сказал, что ваше приложение все равно не работает.Когда очередь заполнится, ваше приложение не сможет дышать.Экран не будет рисовать, любая обработка, которую вы выполняете, будет устаревшей, и случаются все виды плохих вещей.Если вы находитесь в такой ситуации, вам может потребоваться выяснить, почему.