Оказывается все просто и не просто одновременно. Проблемы нам подкладывает само 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; }
No comments:
Post a Comment