10 November, 2011

Как определить есть ли очередь сообщений у треда?

Оказывается все просто и не просто одновременно. Проблемы нам подкладывает само Win32 API - оно при любом удобном случае само создает очередь сообщений для треда, если ее еще не было. Про IsGUIThread() я ничего особого говорить не буду, так как он позволяет узнать то, что нам нужно, только для текущего треда. И, кстати, метод отсутствует в WinCE. На помощь нам придет PostThreadMessage(), но у него есть одна неприятная особенность - тот тред в котором вы его вызвали приобретает очередь сообщений, даром. Поэтому вызывать его для текущего треда бессмысленно. Вот и пришлось для него завести специальный, рабочий тред.

// Note: It works correctly when GetCurrentThreadId() != tid !
//       Current thread will have the message queue after this call!
bool HasThreadMessageQueue(DWORD const tid)
{
  return PostThreadMessage(tid, WM_NULL, 0, 0) || GetLastError() == ERROR_NOT_ENOUGH_QUOTA;
}