freeze проблем
7 отговора
241 прегледа
freeze проблем
Здравейте,
Имам следния проблем:
Докато се изпълнява някой цикъл, програмата "замръзва" и не обработва вход/изход.Как мога да го предотвратя?
Имам следния проблем:
Докато се изпълнява някой цикъл, програмата "замръзва" и не обработва вход/изход.Как мога да го предотвратя?
Re: freeze проблем
Абе аз като "на всяка манджа мерудия", ама ще ми простите може би...
Освен това препоръчително е, ако не искаш потребителя да ти затвори приложението, докато си в цикъла, и да се омажат нещата, да си инициализираш една глобална променлива, например FCanClose да бъде FALSE, и на събитието на формата OnCloseQuery да присвояваш CanClose:=FCanClose, а след цикъла, да правиш FCanClose:=True;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=FCanClose;
end;
Защото Application.ProcessMessages разрешава обработката на Windows съобщенията, и току виж, потребителя ти цъкнал някой бутон който не трябва.

Освен това препоръчително е, ако не искаш потребителя да ти затвори приложението, докато си в цикъла, и да се омажат нещата, да си инициализираш една глобална променлива, например FCanClose да бъде FALSE, и на събитието на формата OnCloseQuery да присвояваш CanClose:=FCanClose, а след цикъла, да правиш FCanClose:=True;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=FCanClose;
end;
Защото Application.ProcessMessages разрешава обработката на Windows съобщенията, и току виж, потребителя ти цъкнал някой бутон който не трябва.
ПроцесМесидж, има тънкости, внимавай.
Ползването на процеснесидж е удобно, но освен със затварянето на вормата, трябва да го съобразиш и с други процеси, които не трябва да са паралени (или не могат да са реентрантни).
Re: freeze проблем
Приложението не може да се затвори, докато не е приключило обработването на всички събития. Следователно, ако процедурата с цикъла е събитие, изпълняващо се в отговор на съобщение (напр. OnClick), потребителят _не_ може да затвори приложението, докато не приключи процедурата. Така че това с флага за CanClose е излишно.
Re: freeze проблем
Ами изнеси цикъла в отделен thread.
И може да изпращаш информация за това до къде е стигал този thread с работата си към главния thread на програмата.
И може да изпращаш информация за това до къде е стигал този thread с работата си към главния thread на програмата.