VC2008+WTL8.0
Есть не модальный WTL диалог, на нем две кнопки: Start и Stop.
По клику на кнопку Start:
а) создается Event
б) создается новая Thread
в) WaitForSingleObject на Thread
По клику на Stop:
а) SetEvent для созданного Event
В процедуре для новой Thread просто WaitForSingleObject для Event
Вот код:
HANDLE g_hExit = 0;
unsigned __stdcall ThreadFunc( void* pArguments )
{
WaitForSingleObject(g_hExit,INFINITE);
_endthreadex( 0 );
return 0;
}
LRESULT CMainDlg::OnBnClickedStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
g_hExit = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadFunc,(void*)this, 0,NULL);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
CloseHandle(g_hExit);
g_hExit = NULL;
return 0;
}
LRESULT CMainDlg::OnBnClickedStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (g_hExit)
SetEvent(g_hExit);
return 0;
}
При нажатии на кнопку Start нить создается, процедура запускается и после этого приложение перестает реагировать. Как я понимаю, что перестают обрабатываться сообщения в основной нити. Как сделать, чтобы они обрабатывались.
Спасибо.
Здравствуйте, IvanIvanich, Вы писали:
[]
В мсдн все написано:
WaitForSingleObject
Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. Two examples of code that indirectly creates windows are DDE and the CoInitialize function. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.
Выход — использовать MsgWaitForMultipleObjects(Ex)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, BuHHunyx, Вы писали:
BHH>В мсдн все написано:
BHH>Выход — использовать MsgWaitForMultipleObjects(Ex)
Спасибо, то что надо было — заработало. Но теперь немного другая проблема.
Я сделал так:
HANDLE g_hExit = 0;
unsigned __stdcall ThreadFunc( void* pArguments )
{
WaitForSingleObject(g_hExit,INFINITE);
_endthreadex( 0 );
return 0;
}
LRESULT CMainDlg::OnBnClickedStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
g_hExit = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadFunc,(void*)this, 0,NULL);
while (TRUE)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT){
SetEvent(g_hExit);
break;
}
DispatchMessage(&msg);
}
DWORD dwRet = MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLEVENTS);
if (dwRet == WAIT_OBJECT_0)
break;
};
CloseHandle(hThread);
CloseHandle(g_hExit);
g_hExit = NULL;
return 0;
}
LRESULT CMainDlg::OnBnClickedStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (g_hExit)
SetEvent(g_hExit);
return 0;
}
последовательность Start/Stop/Ok работает так как надо.
Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается
Что не так я сделал?
Здравствуйте, IvanIvanich, Вы писали:
II>Здравствуйте, BuHHunyx, Вы писали:
BHH>>В мсдн все написано:
BHH>>Выход — использовать MsgWaitForMultipleObjects(Ex)
II>Спасибо, то что надо было — заработало. Но теперь немного другая проблема.
II>Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается Что не так я сделал?
Сам себе отвечаю. Цикл переделал так, теперь работает:
while (TRUE)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (msg.message == WM_QUIT){
SetEvent(g_hExit);
break;
}
GetMessage(&msg,NULL,0,0);
DispatchMessage(&msg);
}
DWORD dwRet = MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLEVENTS);
if (dwRet == WAIT_OBJECT_0)
break;
};
Здравствуйте, IvanIvanich, Вы писали:
[]
II>последовательность Start/Stop/Ok работает так как надо.
II>Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается Что не так я сделал?
Висит рабочий поток — нужно дождаться пока он завершится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>