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

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

Сообщений: 2425


« : 29 мая 2008, 16:49:50 »

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

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

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

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

Сообщений: 2425


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

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

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