Отправляет email-рассылки с помощью сервиса Sendsay

Borland C++ Builder - всякая всячина

  Все выпуски  

Borland C++ Builder всякая всячина (Прерывание циклов с клавиатуры)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Приветствую всех получателей рассылки Borland C++ Builder - всякая всячина!

№8. Прерывание циклов с клавиатуры

Иногда в процессе разработки программ возникают ситуации, когда нужно провернуть какую-нибудь работу, занимающую очень много процессорного времени, например, копирование какой-то информации в буфер обмена в нескольких форматах для совместимости с различными пакетами. Обычно такие операции производятся в цикле, который "вешает" систему на неопределенное время. Можно, конечно, в строке статуса вывести предполагаемое время окончания операции, но пользователю легче не становится от того, что он будет знать, что операция будет длиться еще 126 минут и 43 секунды, особенно, если он случайно инициировал эту операцию.

Выход один: разрешить пользователю прерывать выполнение операции. Чем? А чем еще, как не клавишей "Escape". Но! Имеем в этом случае две проблемы:

  1. Если "подвесить проверку нажатия "Esc" на элемент управления, выполняющий такую продолжительную операцию, то есть риск, что сообщение о нажатии до него просто не дойдет, если он не будет обладать в этот момент фокусом ввода.
  2. Цикл обычно "вешает" систему до такой степени, что она даже мяукнуть не может. В результате, сообщение о нажатии на "Esc" обрабатывается только после того, как будет завершена работа цикла (то есть, через 126 минут и 43 секунды).

Логически напрашивается решение поместить проверку нажатия на "Esc" в тело цикла, если конечно он не скрыт в библиотечной функции. В приведенном ниже примере я нажатием кнопки Button1 загоняю систему в бесконечный, по сути, цикл, выйти из которого она может только если вы нажмете клавишу "Esc". Для этого используется функция Win32 API: SHORT GetAsyncKeyState(int vKey);, которая возвращает ненулевое значение, если была нажата клавиша, определяемая кодом vKey. Так называемые коды виртуальных клавиш вы можете посмотреть в разделе справки по Win32 API если в строке поиска по указателю наберете Virtual-Key Codes. И, наконец, прмер:

//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    bool Test= true;
    while (Test)
    {
      if (GetAsyncKeyState(VK_ESCAPE)!=0) Test= false;
    }
}
//---------------------------------------------------------------------------

Вот и все, темку мы сегодня рассмотрели очень короткую, но иногда добавление только одной строчки в программу может в корне изменить ее содержание. Успехов вам...



С уважением, Васильев Евгений...

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное