Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Как избежать подвисания программы, когда процедура выполняется   Найти похожие ветки 

 
Кен ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
1-65912
Alexious
2003-11-08 13:53
2003.11.20
Закрытие формы


3-65796
GIL
2003-10-30 16:27
2003.11.20
Поиск БД


1-65815
Anonim-777
2003-10-29 01:52
2003.11.20
Насчёт модальной формы


1-65974
Шурик
2003-11-10 22:55
2003.11.20
Где найти исходники приличных программ...


1-65999
Dark Elf
2003-11-10 14:28
2003.11.20
Кодировка в RichEdit