Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как вернуться из потока к методу OnInitDialog()?


Автор: BBulat 25.2.2010, 08:09
В моем приложении метод OnInitDialog()  открывает драйвер для чтения и записи. Чтение и запись в драйвер происходят в двух разных потоках асинхронным способом. Мне необходимо возвращаться в метод OnInitDialog() при не выполнении функций writefile или readfile.
Код

BOOL CTestAPIDlg::OnInitDialog() {...}
UINT TransmitThread( LPVOID pParam )
{
   Success = WriteFile(PipeOut, &buf_w, 60, &nBytes, &gOverLapped_Write);                
   DWORD flag = WaitForSingleObject(hEvent_Write,100);    
   if(flag==WAIT_OBJECT_0)    GetOverlappedResult(PipeOut,&gOverLapped_Write,&nBytes,TRUE);            
   if(flag==WAIT_TIMEOUT)    ??.OnInitDialog();
}

Как правильно вызвать метод OnInitDialog()  из потока?
Зранее благодарен!

Автор: Andrey44 25.2.2010, 12:27
Не знаю правильно ли это, но попробуй послать PostMessage(hwnd, WM_INITDIALOG, 0, 0)

Автор: SenkraD 25.2.2010, 12:41
Цитата(BBulat @  25.2.2010,  08:09 Найти цитируемый пост)
Мне необходимо возвращаться в метод OnInitDialog() при не выполнении функций writefile или readfile.
Что означает вернутся? Если вызвать, то так, как посоветовал Andrey44, а иначе опишите задачу более полно
 

Автор: Earnest 1.3.2010, 16:23
Надо полагать, "вернуться" - значит получить управление и знать при этом, что чтение запись накрылись...
Вопрос такой: все ли чтение-запись должно произойти, пока не завершился OnInitDialog?  Если да, то просто дождись завершения вызванного  потока, а код завершения передай через возвращаемое функцией потока значение. Если нужно вернуть управление только в случае неудачи, а если чтение-запись начались успешно и будут продолжаться некоторое время, а диалог в это время должен чего-то делать, то тебе понадобятся два события - "хорошо" и "плохо". В OnInitDialog жди WaitForMultipleObjects, а в функции потока возбуди соответствующее событие в зависимости от результата.
И еще вопрос: так ли необходимо делать это именно в OnInitDialog? Если все дело в том, чтобы показать соответствующее сообщение (или что-то в этом роде) и закрыть диалог, то просто заведи User Message и пошли его диалогу (PostMessage). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)