Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Форма зависает. Не реагирует на BottonClick

9.7K
09 апреля 2007 года
oltzowwa
105 / / 15.02.2007
Такая проблема: на нажатие кнопки создается форма, на событие OnIdle выполняются вычисления. А пользователю посредством ProgressBar'а сообщается о ходе выполнения. Но все это можно отменить, если нажать Отмену. На отмену вызываетя Close(). НО пока ВСЁ не вычислиться форма не закрывается и на отмену не реагирует. Почему? Кто-нибудь знает?
497
09 апреля 2007 года
IL84
267 / / 24.04.2003
Потому что очередь сообщений не обрабатывается. В цикле сообщений надо поставить Application.ProcessMessages(); В обработчике "Отмена" выставить флаг на прекращение вычислений и закрыть форму.
4.6K
09 апреля 2007 года
Tokolist
268 / / 22.03.2007
Цитата: IL84
Потому что очередь сообщений не обрабатывается. В цикле сообщений надо поставить Application.ProcessMessages(); В обработчике "Отмена" выставить флаг на прекращение вычислений и закрыть форму.


ИМХО лучше использовать потоки.

9.7K
09 апреля 2007 года
oltzowwa
105 / / 15.02.2007
Цитата: IL84
В цикле сообщений надо поставить Application.ProcessMessages();



Что за цикл сообщений? в функции OnIdle вызвать Application.ProcessMessages()?

497
10 апреля 2007 года
IL84
267 / / 24.04.2003
Тьфу, не в цикле сообщений, а в цикле где вычисления выполняются. Идея с потоками выглядит гораздо лучше.
9.7K
10 апреля 2007 года
oltzowwa
105 / / 15.02.2007
Вы советуете поток на выполнение вычислений. Но у меня проблема не в этом. Нужно, чтобы форма менялась (например, ProgressBar меняется) без участия пользователя, но при желании работу этой формы можно отменить.

Application.ProcessMessages сработала (Спасибо за идею) в каком-то смысле :) : работающая форма перестала так глухо зависать, после того, как в цикле использовалось ProcessMessages() раз 7. НО остальные Forms моего приложения стали запаздывать от посланных им сообщений.
Что получается? Если 10 поставлю, быстрее работать будет?

У меня сомнения по поводу использования метода OnIdle, но другой вариант просто в голову не пришел и не приходит. Интересно, есть ли альтернативы?

PS А потоки разве значительно ускоряют работу? Процессор один (сейчас и не один, но для параллельной работы вроде специальные настройки нужны), и физически они все равно последовательно работают. Плюс ко всему их синхронизировать нужно - это тоже время занимает.
309
11 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:

У меня сомнения по поводу использования метода OnIdle, но другой вариант просто в голову не пришел и не приходит. Интересно, есть ли альтернативы?


Есть - компоненты типа TTimer. Указывается время в милисекундах и вешается обработчик на OnTimer.

 
Код:
void TForm1::Timer1Timer (TObject *Sender)
{
   Timer1->Enabled = false; // Останавливаем
   ЧТО_ТО_ДЕЛАЕМ;
   Timer1->Enabled = true; // Запускаем
}


А событие OnIdle (ожидание) можно использовать только для очень простых действий
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог