freeze проблем

7 отговора 241 прегледа
#1

freeze проблем

Здравейте,
Имам следния проблем:
Докато се изпълнява някой цикъл, програмата "замръзва" и не обработва вход/изход.Как мога да го предотвратя?

Отговор
в отговор на trump #2

Re: freeze проблем

Сложи в цикъла Application.ProcessMessages

Отговор
в отговор на TRN #3

Re: freeze проблем

Абе аз като "на всяка манджа мерудия", ама ще ми простите може би...


Освен това препоръчително е, ако не искаш потребителя да ти затвори приложението, докато си в цикъла, и да се омажат нещата, да си инициализираш една глобална променлива, например FCanClose да бъде FALSE, и на събитието на формата OnCloseQuery да присвояваш CanClose:=FCanClose, а след цикъла, да правиш FCanClose:=True;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=FCanClose;
end;

Защото Application.ProcessMessages разрешава обработката на Windows съобщенията, и току виж, потребителя ти цъкнал някой бутон който не трябва.

Отговор
в отговор на trump #4

ПроцесМесидж, има тънкости, внимавай.

Ползването на процеснесидж е удобно, но освен със затварянето на вормата, трябва да го съобразиш и с други процеси, които не трябва да са паралени (или не могат да са реентрантни).

Отговор
в отговор на trump #5

Много Ви благодаря!

Много Ви благодаря!

Отговор
в отговор на ИвKo #6

Re: freeze проблем

Приложението не може да се затвори, докато не е приключило обработването на всички събития. Следователно, ако процедурата с цикъла е събитие, изпълняващо се в отговор на съобщение (напр. OnClick), потребителят _не_ може да затвори приложението, докато не приключи процедурата. Така че това с флага за CanClose е излишно.

Отговор
в отговор на Formal #7

Re: freeze проблем

Засрамен

Отговор
в отговор на trump #8

Re: freeze проблем

Ами изнеси цикъла в отделен thread.
И може да изпращаш информация за това до къде е стигал този thread с работата си към главния thread на програмата.

Отговор