Я читал разные темы, касающиеся использования WaitForSingleObject()
, но я до сих пор не понимаю, почему я не могу заставить его работать. У меня есть индикатор выполнения, который обновляется с использованием AfxBeginThread
, и я хотел бы подождать, чтобы закончить работу, прежде чем делать другой процесс. Мой код основан на следующем примере: http://www.codeproject.com/Articles/2459/Using-AfxBeginThread-with-class-member-controllingКак использовать WaitForSingleObject()
startupEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
THREADSTRUCT *_param = new THREADSTRUCT;
_param->_this = this;
CWinThread* thread = AfxBeginThread (StartThread, _param);
WaitForSingleObject(startupEvent , INFINITE);
AfxMessageBox(_T("This message should pop up after the thread terminates."));
Я определил startupEvent
переменную в файле заголовка, как это:
protected:
HANDLE startupEvent;
Вот метод резьбы.
UINT CView::StartThread (LPVOID param)
{
THREADSTRUCT* ts = (THREADSTRUCT*)param;
::SetEvent(ts->_this->startupEvent);
//Some heavy calculation from here + ProgressBar update
return 1;
}
В приведенном выше примере, я хотел бы, чтобы MessageBox появиться после того, как нить прекратить proccess, но в настоящее время он появляется раньше.
Как насчет, может быть, вызова ':: SetEvent (ts -> _ this-> startupEvent);' когда задание закончилось, а не раньше? –
Я попытался вызвать его, когда работа закончена, но она выглядит застрявшей в бесконечном цикле (индикатор выполнения не обновляется, и я больше не могу нажимать на графический интерфейс) – oro777
@ oro777 Это потому, что ваш основной поток (который обрабатывает графический интерфейс пользователя)) ожидает, пока поток будет сигнализировать о событии. – molbdnilo