У меня есть многопоточная симуляция, работающая в Windows Vista. Когда я использую PostThreadMessage для отправки сообщений между потоками, я получаю ERROR_INVALID_THREAD_ID, хотя я совершенно уверен (из-за прохождения через отладчик), что идентификатор потока действителен, и у потока есть очередь сообщений, так как я вызываю PeekMessage из каждого потока после того, как я их создам, как указано в MSDN. Вероятно, целевой поток приостановлен, но, насколько я могу судить, это не должно быть проблемой.
Любые подсказки о том, что попробовать? Я моделирую приложение на основе RTOS, поэтому я надеюсь, что мне не придется вводить слишком много кода, специфичного для Windows.
ИЗМЕНИТЬ –
Еще одна подсказка - если я уберу всю блокировку семафоров, сообщения будут работать нормально (хотя есть некоторые известные условия гонки). Но очереди сообщений не должны зависеть от блокировки потока, верно?
Изменить 2 Код также имеет следующий механизм повторных попыток, предложенный MSDN. Но это все равно не работает - повторная попытка всегда терпит неудачу. хм.....
BOOL bResult = false;
int retry = 0;
DWORD dwError = 0;
do
{
bResult = PostThreadMessage(pTaskHandle->dwThreadID,0,0,(LPARAM)pMessage);
if (!bResult)
{
dwError = GetLastError();
retry++; // should only happen once, if the dest thread has no msg queue
// the retry establishes the queue
Sleep(500);
}
} while (!bResult && retry<3); // MSDN says try this a few times to start msg queue