FAQ по C/C++/Visual C++
Работа с сетью Применение PeekMessage |
Составители: SUnteXx, Leprecon |
Применение PeekMessage | |||
BOOL PumpMessage(void) { CWinThread *pThread = AfxGetThread(); MSG msg; while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!pThread->PumpMessage()) break; } return TRUE; };После этого в тело той функции/функций, которые вычисляются наиболее долго необходимо вставить вызовы этой функции (например, в тело цикла, ведь ваша долгоиграющая функция использует циклы, не правда ли?). В общем-то, достаточно это сделать в наиболее «узком» месте, но тут действует принцип «Кашу маслом не испортишь». Если вы хотите иметь возможность остановить процесс во время его выполнения, то вам необходимо следующим образом модифицировать функцию: BOOL PumpMessage(void) { CWinThread *pThread = AfxGetThread(); MSG msg; while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!pThread->PumpMessage()) break; } if(Флаг останова == TRUE) return FALSE; return TRUE; };и ее вызов тогда будет выглядеть следующим образом: if(PumpMessage() == TRUE) { //прекратить процесс вычисления. Можно просто сделать return. }Флаг останова (например, статический BOOL) можно устанавливать в TRUE по нажатию кнопки. P.S. Вышеприведенный вариант PumpMessage так же хорош тем, что позволяет во время длинный вычислений не только нажимать кнопки и прочее, но так же пользоваться горячими клавишами. |
Зачастую в сети, и в нашем форуме так же, встречаются вопросы, по поводу создания процессов. Зачастую, при ближайшем рассмотрении проблемы, выясняется, что авторам вопросов необходимо, что бы программа реагировала на нажатие клавиш и прочих элементов управления во время действия какого ни будь долгого вычисления, процесса поиска или т.п функции, которая надолго «уходит в себя», при этом в диспетчере задач задача получает статус «Not Responding/Не Отвечает». В данном случае организация процесса не самый простой выход. Более простой, это написать функцию следующего вида:|||
|
FAQ составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |