C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Применение PeekMessage / Система / Visual C++

Применение PeekMessage
A: (AQL)
Оригинальная ссылка: нету

Зачастую в сети, и в нашем форуме так же, встречаются вопросы, по поводу создания процессов. Зачастую, при ближайшем рассмотрении проблемы, выясняется, что авторам вопросов необходимо, что бы программа реагировала на нажатие клавиш и прочих элементов управления во время действия какого ни будь долгого вычисления, процесса поиска или т.п функции, которая надолго «уходит в себя», при этом в диспетчере задач задача получает статус «Not Responding/Не Отвечает». В данном случае организация процесса не самый простой выход. Более простой, это написать функцию следующего вида:
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 так же хорош тем, что позволяет во время длинный вычислений не только нажимать кнопки и прочее, но так же пользоваться горячими клавишами.