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

Ваш аккаунт

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

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

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

Как более "умно" прервать операцию (цикл)?

490
11 февраля 2008 года
frid-karatel
357 / / 15.09.2007
Доброго времени суток!

Интересует возможность прервать выполняемую операцию, напр. запись в файл по циклу от 1 до 10 000 000.

Если использовать Application->ProcessMessages(), чтобы ждать нажатия кнопки ESC, то время выполнение цикла увеличивается в несколько раз. Если не использовать Application->ProcessMessages(), то нажатие ESC вообще никак не обрабатывается, ну за редким исключением.

Что мне тут можно сделать? Хочется как можно лучше и правильней обработать такую возможность...
535
12 февраля 2008 года
Нездешний
537 / / 17.01.2008
Функцию с циклом в отдельный поток
3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Отдельный поток, в котором переодически проверяется флаг отмены выполнения.
490
12 февраля 2008 года
frid-karatel
357 / / 15.09.2007
да, но как прервать функцию, если она не в потоке? каждый раз проверять?

Да и что даст отдельный поток? насколько быстрее в нем обрабатываются данные? Сколько времени требуется на его инициализацию?
11
12 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
bool flag = true;
for (....)
{
...
  if (!flag) break;
...
}
3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: frid-karatel
да, но как прервать функцию, если она не в потоке? каждый раз проверять?


Это мы обсуждаем в др. ветке. Не будем повторяться.

Цитата: frid-karatel

Да и что даст отдельный поток? насколько быстрее в нем обрабатываются данные? Сколько времени требуется на его инициализацию?


Поток даст независимость (по времени) выполнения операций вычисления задачи от операций UI. Т.к. последние весьма неповоротливые, вынесение бизнес-логики в отдельный поток часто бывает оправданным.

"На сколько быстрее" проверь оперативным путем. Оценку не зная специфики задачи и её реализации давать сложно (невозможно).

Инициализация потока - трудоемкая процедура. Может быть полезнее создать поток один раз и давать ему задания.

490
12 февраля 2008 года
frid-karatel
357 / / 15.09.2007
Цитата: Green
Инициализация потока - трудоемкая процедура. Может быть полезнее создать поток один раз и давать ему задания.


Вот я над этим думал-думал... как же все это организовать... Но в итоге отказался от потоков по некоторым другим причинам...:
1. Я не могу никак отладить ошибку в потоке, т.е. она возникает и мне не показывает строку в коде, а выдает окно дебаггера ( а я в нем, как в лесу :) )
2. При запуске такой функции (которую можно прервать) я показываю мождальное окно, дабы пользователь не тыкал на другие кнопки во время выполнения текущей операции... В этом окне есть статусбар, которые в зависимости от процента выполнения двигается. В функции также идет ображение к компонентам, но иногда, даже частенько, возникают ошибки, и как я понял, сихронизации...

276
12 февраля 2008 года
Rebbit
1.1K / / 01.08.2005
Где ета функция вызывается ? В оброботчике события ?
Я выполнение длительных итеративных вещей делал в onIdle (кажись так называлось). За один визов проходил один цыкл итерации. При етом нет особого торможения интерфейса. Зато есть сложности в реализации поскольку надо гдето держать промежуточные данные между итерациями.
3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Rebbit
Где ета функция вызывается ? В оброботчике события ?
Я выполнение длительных итеративных вещей делал в onIdle (кажись так называлось). За один визов проходил один цыкл итерации. При етом нет особого торможения интерфейса. Зато есть сложности в реализации поскольку надо гдето держать промежуточные данные между итерациями.


Такой подход (IMHO) в корне неверный.
Получается, что программа в основном создана для UI, а расчеты как-бы на втором месте, когда программе "больше делать нечего" (именно так воспринимается idle).
Для того чтоб свести на нет всю работу программы, достаточно просто быстро водить мышкой. Очередь сообщений будет полна и на расчеты не останется времени. :)

276
12 февраля 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: Green
Такой подход (IMHO) в корне неверный.


Конечно. Но


Ну да так и получается.
[quote=frid-karatel]В функции также идет ображение к компонентам[/quote]

[COLOR=Silver]ЗЫ. Ну и пару слов в свое опровдание.
Когда я так делал то только перешел из Паскаля под ДОС на Делфи и в плане псевдопаралельного выполнения чеголибо знал только Idle TVision-a и прерывание таймера. Плохая но тоже практика :)[/COLOR]

3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Rebbit
Конечно. Но

Не знаю как еще ето в одном потоке делать.


Чуть иначе. Изменить приоритет.
Не делать вычисления частью цикла обработки сообщений, а сделать цикл обработки сообщений частью некоторого общего цикла. Т.о. разделить время между вычислением и UI:

 
Код:
while(!complited) {
    calculation();
    processWindowMessage();
}

void processWindowMessage() {
    if( PeekMessage(......) ) {  // Nonblocking call !
        // do something
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог