Re[3]: Опять про потоки.
От: Аноним  
Дата: 23.11.03 22:15
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.