C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программа не отвечает во время выполнения большого цикла  (Прочитано 15372 раз)
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Программа не отвечает во время выполнения большого цикла
« : 29 Май 2008, 16:49:50 »

Как сделать, что бы можно было прервать выполнение цикла в программе:
Код
for (long i=0; i100000000; i++)
{
// DoSomething();
}
 
нажатием на кнопку?

При таком подходе приложение не будет реагировать на поступающие от системы сообщения, пока не завершиться цикл.
Для того что бы приложение могло обрабатывать сообщения необходимо вызывать метод TApplication::ProcessMessages(); таким образом пользователь сможет нажать на кнопку "Стоп" в обработчике которой нужно изменить состояние флага на выход из цикла:

Код
bool stop_flag = false;
void __fastcall TForm1::StopButtonClick (TObject *Sener)
{
      stop_flag = true;
}
//---------------------------------------------------
 
void MyFunc (void)
{
      for (long i=0; i100000000; i++)
      {
             // DoSomething();
             Application->ProcessMessages();
             if (stop_flag) break;
      }
}
 
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« Ответ #1 : 30 Май 2008, 09:28:38 »

Побочным эффектом вашего варианта является то, что при включенной так обработке сообщений метод с циклом может быть вызван ещё раз из того же gui, что приведёт к ошибкам.

Дабы избежать повторного запуска обработки цикла, необходимо отключить такую возможность, например сделать кнопку "Старт" (запускающуюю эту обработку) Enable = false; и это изменять состояние по нажатию кнопки "Стоп".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.093 секунд. Запросов: 20.