void TForm1::Timer1Timer (TObject *Sender)
{
Timer1->Enabled = false; // Останавливаем
ЧТО_ТО_ДЕЛАЕМ;
Timer1->Enabled = true; // Запускаем
}
Форма зависает. Не реагирует на BottonClick
Такая проблема: на нажатие кнопки создается форма, на событие OnIdle выполняются вычисления. А пользователю посредством ProgressBar'а сообщается о ходе выполнения. Но все это можно отменить, если нажать Отмену. На отмену вызываетя Close(). НО пока ВСЁ не вычислиться форма не закрывается и на отмену не реагирует. Почему? Кто-нибудь знает?
Потому что очередь сообщений не обрабатывается. В цикле сообщений надо поставить Application.ProcessMessages(); В обработчике "Отмена" выставить флаг на прекращение вычислений и закрыть форму.
Цитата: IL84
Потому что очередь сообщений не обрабатывается. В цикле сообщений надо поставить Application.ProcessMessages(); В обработчике "Отмена" выставить флаг на прекращение вычислений и закрыть форму.
ИМХО лучше использовать потоки.
Цитата: IL84
В цикле сообщений надо поставить Application.ProcessMessages();
Что за цикл сообщений? в функции OnIdle вызвать Application.ProcessMessages()?
Тьфу, не в цикле сообщений, а в цикле где вычисления выполняются. Идея с потоками выглядит гораздо лучше.
Application.ProcessMessages сработала (Спасибо за идею) в каком-то смысле :) : работающая форма перестала так глухо зависать, после того, как в цикле использовалось ProcessMessages() раз 7. НО остальные Forms моего приложения стали запаздывать от посланных им сообщений.
Что получается? Если 10 поставлю, быстрее работать будет?
У меня сомнения по поводу использования метода OnIdle, но другой вариант просто в голову не пришел и не приходит. Интересно, есть ли альтернативы?
PS А потоки разве значительно ускоряют работу? Процессор один (сейчас и не один, но для параллельной работы вроде специальные настройки нужны), и физически они все равно последовательно работают. Плюс ко всему их синхронизировать нужно - это тоже время занимает.
Цитата:
У меня сомнения по поводу использования метода OnIdle, но другой вариант просто в голову не пришел и не приходит. Интересно, есть ли альтернативы?
Есть - компоненты типа TTimer. Указывается время в милисекундах и вешается обработчик на OnTimer.
Код:
А событие OnIdle (ожидание) можно использовать только для очень простых действий