Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизКак избежать подвисания программы, когда процедура выполняется Найти похожие ветки
← →
Кен (2003-11-07 03:39) [0]давольно долго ? Не нажимаются кнопки, не обновляется её окно. То есть она как бы висит, но когда процедура выполнена, то всё приходит в норму.
Решается ли эта проблема или так и должно быть ?
← →
Slavian (2003-11-07 03:53) [1]application.ProcessMessages;
← →
Германн (2003-11-07 03:56) [2]Или Thread. Это в зависимости от задачи.
← →
Кен (2003-11-07 04:08) [3]
> Slavian © (07.11.03 03:53) [1]
> application.ProcessMessages;
Помогло. Только тормозить стало на пятнадцать процентов.
Этот ProcessMessages нельзя как нибудь отрегулировать, чтобы поменеше тормозило ?
А вообще можно ли работающуюу процедуру остановить в определённый момент нажатием кнопки ?
← →
Думкин (2003-11-07 05:03) [4]1.Если не нравится, то юзай
> [2] Германн © (07.11.03 03:56).
Примеров тому - море.
2. Можно. Но не всегда сразу.
← →
Anatoly Podgoretsky (2003-11-07 08:49) [5]1. Она почти не тормозит, а тормозит другое, обработчики разных событый, конечно можно реже вызывать, но тогда события будут накапливаться и результат возможно тотже
2. Можно
← →
Fiend (2003-11-07 09:34) [6]Поддерживаю Anatoly Podgoretsky © (07.11.03 08:49) [5]
сделай чтобы она чуть реже вызывалась. я так понимаю у тебя там цикл большой? сделай чтобы она вызывалась не каждый раз, а скажем в каждую десятую итерацию.
← →
Кен (2003-11-08 01:26) [7]
> Германн © (07.11.03 03:56) [2]
> Или Thread. Это в зависимости от задачи.
Что то этот Thread какой то сложный. Я хотел, просто пару строчек добавлять в уже имеющиеся коды. А с этим Thread похоже придётся начинать новый огород городить.
> Anatoly Podgoretsky © (07.11.03 08:49) [5]
> 1. Она почти не тормозит, а тормозит другое, обработчики
> разных событый, конечно можно реже вызывать, но тогда события
> будут накапливаться и результат возможно тотже
Да. Вызывать реже - это выход. Причём что мне понравилось, можно запустить одну и туже процедуру второй раз, ещё до того, как закончил работать первый. Хотя можно это и блокировать пряча и потом показывая кнопку вызова процедуры.
> 2. Можно
А как ?
Я хочу визуально контролировать как там процедура работает, и когда она сделает то, что нужно, просто терменировать её.
Можно, конечно в саму процедуру встроить проверку какого нибудь isKeyDown(ESC), но мне хочется не лезть в код процедуры и везде вставлять проверки, а чтобы она вырубалась извне.
← →
Slavian (2003-11-08 02:39) [8]чтобы по нажатию кнопки все прекратить сделай переменную типа Boolean, вставь оператор проверки в начало цикла типа так :
For i:0 to 100 do begin
...
if b then exit;
{.....}
end;
...
Button1.Click;
begin
b:=true;
end;
вот и всё!!!
а по быстрее.... можно использовать yeld {кажется так пишется, я не помню, не пользуюсь!}
← →
Германн (2003-11-08 03:09) [9]С "этим Thread" действительно придется городить новый огород. Но тут уже тебе решать, что лучше для твоей задачи.
← →
Кен (2003-11-08 03:25) [10]
> Slavian © (08.11.03 02:39) [8]
> чтобы по нажатию кнопки все прекратить сделай переменную
> типа Boolean, вставь оператор проверки в начало цикла типа
> так :
> For i:0 to 100 do begin
> ...
> if b then exit;
> {.....}
> end;
> ...
> Button1.Click;
> begin
> b:=true;
> end;
>
> вот и всё!!!
> а по быстрее.... можно использовать yeld {кажется так пишется,
> я не помню, не пользуюсь!}
См. мой предшествующий постинг.
Если цикл не один, а их много подряд, то чего, сорок проверок вставлять ? Нехочу загромождать код этой суетой.
Хочу что-нибудь типа Снять задачу, только для процедуры. Как по ctrl+alt+delete . Или хотя бы ответ, возможно такое или нет ?
← →
Ihor Osov'yak (2003-11-08 03:34) [11]> но мне хочется не лезть в код процедуры и везде вставлять проверки, а чтобы она вырубалась извне.
Можно, если процедура выполняется в отдельном потоке (Thread). Вырубить вместе с потоком. Но категорически не рекомендуется..
Зы - пересматривай архитектуру приложения.
← →
Igorek (2003-11-08 10:53) [12]> Кен © (08.11.03 03:25) [10]
> Если цикл не один, а их много подряд, то чего, сорок проверок
> вставлять ? Нехочу загромождать код этой суетой.
Лучше уж делай проверки а не поток. Так будет быстрее сделать. А проверки можно организовать так: Делаешь все циклы в блоке try, потом вызываешь время от времени внутри процедуру напр. AssertTerminate, которая делает проверку и если надо терминировать - возбуждает исключение, которое ты обработаешь после блока try.
← →
Lmz (2003-11-08 11:50) [13]Почитай нормальных книжек, типа книжку Тейксера и Пачеко. Главу про потоки и радуйся и не задавай глупых вопросов
← →
Тохус (2003-11-08 12:14) [14]Удалено модератором
Примечание: Offtopic
← →
Anatoly Podgoretsky (2003-11-08 13:36) [15]Кен © (08.11.03 01:26) [7]
Зачем две, вставляй одну! Application.ProcessMessages
← →
mOOx_ (2003-11-08 15:05) [16]Удалено модератором
Примечание: Offtopic
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c