Здравствуйте, Tarantul, Вы писали:
T>Здравствуйте, vadim77, Вы писали:
V>>Try MsgWaitForMultipleObjectsEx
V>>This is code snippet from the book "MS Press — Programming Applications for MS Windows 4th Edition" by Jeffry Richter
V>>BOOL fQuit FALSE; //Should the loop terminate?
V>>while (!fQuit)
V>>{
V>>//Wake when the kernel object is signaled OR
V>>//if we have to process a UI message.
V>> DWORD dwResult = MsgWaitForMultipleObjectsEx(1, &hYourThreadHandle,
V>> INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE);
V>> switch(dwResult)
V>> {
V>> case WAIT_OBJECT_0: // The event became signaled.
V>> break;
V>> case WAIT_OBJECT_0 + 1: //A message is in our queue.
V>> //Dispatch all of the messages.
V>> MSG msg;
V>> while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
V>> {
V>> if(msg.message==WM_QUIT)
V>> {
V>> //A WM_QUIT message, exit the loop
V>> fQuit = TRUE;
V>> }
V>> else
V>> {
V>> //Translete and dispatch the message.
V>> TranslateMessage(&msg);
V>> DispatchMessage(&msg);
V>> }
V>> }// Our queue is empty.
V>> break;
V>> }
V>>}//End of while loop
T>Если MsgWait... действительно пропускает виндовс-сообщения, то это как раз то, что надо.
T>На данный момент в главном потоке я остановился на таком _рабочем_
варианте:
T>T>void CMainFrame::OnCmdStopScan()
T>{
T> if(pScanThread!=NULL)
T> {
T> m_pReportDlg->m_pPS->m_SearchPP.m_ScanLocker.ExitFromThread();
T> bool fWaiting=true;
T> while(fWaiting)
T> {
T> if(WaitForSingleObject(pScanThread->m_hThread,0)==WAIT_TIMEOUT)
T> {
T> MSG msg;
T> if(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
T> {
T> TranslateMessage(&msg);
T> DispatchMessage(&msg);
T> }
T> }
T> else fWaiting=false;
T> }
T> }
T>}
T>
T>Всем спасибо.
????
Да но у тебя не MsgWait... а WaitForSingle... я не проверял но такая штука не должна работать корректно. Я имею ввиду что с timeout 0 ты попадаешь в бесконечный цикл вплоть до выхода из фонового потока т.е. есть сообщение — обрабатываешь его нет — проверяешь по новой. На мой взгляд недстаток в том что такой цикл по идее должен загрузить на все 100% процессор. Все равно что поставить
for (int i = 0; i < 1000000000; i++);
В то время как MsgWait... ждет либо события ( в данном случае выход из потока) либо сообщения причем все то время что ни событие ни сообщение не пришло твое приложение находиться в idle, процессор не загружен и остальные приложения могут работать....
vadik77