Чтобы добавить к Энтони Уильямсу правильный ответ, код, который я использую для решения этой проблемы, выглядит следующим образом.У меня есть класс, похожий на MyThread ...
void MyThread::Start()
{
m_hResumeMain = CreateEvent(NULL,FALSE,FALSE,NULL);
m_hThread = CreateThread(NULL,0,ThreadProc,this,0,&m_dwThreadId);
WaitForSingleObject(m_hResumeMain,INFINITE);
CloseHandle(m_hResumeMain);
m_hResumeMain=0;
}
DWORD MyThread::ThreadProc(LPVOID pv)
{
MyThread* self = (MyThread*)pv;
return self->ThreadProc();
}
DWORD MyThread::ThreadProc()
{
MSG msg;
// Create the thread message queue
PeekMessage(&msg,0,0,0,PM_NOREMOVE);
// Resume the main thread
SetEvent(m_hResumeMain);
while(GetMessage(&msg,0,0,0)>0){
if(msg.hwnd){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
DoThreadMessage(&msg);
}
}
return 0;
}
Суть проблемы в том, что вы в конечном итоге не можете полагаться на Sleep
, чтобы гарантировать, что рабочий поток достаточно инициализирован.Кроме того, как правило, существует небольшой объем работы, которую должен выполнить рабочий поток, прежде чем запускать поток запуска можно будет возобновить.Поэтому создайте объект события перед созданием потока, дождитесь его в основном потоке и подайте сигнал рабочему потоку после завершения инициализации.