Как более "умно" прервать операцию (цикл)?
Интересует возможность прервать выполняемую операцию, напр. запись в файл по циклу от 1 до 10 000 000.
Если использовать Application->ProcessMessages(), чтобы ждать нажатия кнопки ESC, то время выполнение цикла увеличивается в несколько раз. Если не использовать Application->ProcessMessages(), то нажатие ESC вообще никак не обрабатывается, ну за редким исключением.
Что мне тут можно сделать? Хочется как можно лучше и правильней обработать такую возможность...
Да и что даст отдельный поток? насколько быстрее в нем обрабатываются данные? Сколько времени требуется на его инициализацию?
for (....)
{
...
if (!flag) break;
...
}
Это мы обсуждаем в др. ветке. Не будем повторяться.
Да и что даст отдельный поток? насколько быстрее в нем обрабатываются данные? Сколько времени требуется на его инициализацию?
Поток даст независимость (по времени) выполнения операций вычисления задачи от операций UI. Т.к. последние весьма неповоротливые, вынесение бизнес-логики в отдельный поток часто бывает оправданным.
"На сколько быстрее" проверь оперативным путем. Оценку не зная специфики задачи и её реализации давать сложно (невозможно).
Инициализация потока - трудоемкая процедура. Может быть полезнее создать поток один раз и давать ему задания.
Вот я над этим думал-думал... как же все это организовать... Но в итоге отказался от потоков по некоторым другим причинам...:
1. Я не могу никак отладить ошибку в потоке, т.е. она возникает и мне не показывает строку в коде, а выдает окно дебаггера ( а я в нем, как в лесу :) )
2. При запуске такой функции (которую можно прервать) я показываю мождальное окно, дабы пользователь не тыкал на другие кнопки во время выполнения текущей операции... В этом окне есть статусбар, которые в зависимости от процента выполнения двигается. В функции также идет ображение к компонентам, но иногда, даже частенько, возникают ошибки, и как я понял, сихронизации...
Я выполнение длительных итеративных вещей делал в onIdle (кажись так называлось). За один визов проходил один цыкл итерации. При етом нет особого торможения интерфейса. Зато есть сложности в реализации поскольку надо гдето держать промежуточные данные между итерациями.
Я выполнение длительных итеративных вещей делал в onIdle (кажись так называлось). За один визов проходил один цыкл итерации. При етом нет особого торможения интерфейса. Зато есть сложности в реализации поскольку надо гдето держать промежуточные данные между итерациями.
Такой подход (IMHO) в корне неверный.
Получается, что программа в основном создана для UI, а расчеты как-бы на втором месте, когда программе "больше делать нечего" (именно так воспринимается idle).
Для того чтоб свести на нет всю работу программы, достаточно просто быстро водить мышкой. Очередь сообщений будет полна и на расчеты не останется времени. :)
Конечно. Но
Ну да так и получается.
[quote=frid-karatel]В функции также идет ображение к компонентам[/quote]
[COLOR=Silver]ЗЫ. Ну и пару слов в свое опровдание.
Когда я так делал то только перешел из Паскаля под ДОС на Делфи и в плане псевдопаралельного выполнения чеголибо знал только Idle TVision-a и прерывание таймера. Плохая но тоже практика :)[/COLOR]
Не знаю как еще ето в одном потоке делать.
Чуть иначе. Изменить приоритет.
Не делать вычисления частью цикла обработки сообщений, а сделать цикл обработки сообщений частью некоторого общего цикла. Т.о. разделить время между вычислением и UI:
calculation();
processWindowMessage();
}
void processWindowMessage() {
if( PeekMessage(......) ) { // Nonblocking call !
// do something
}
}