Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

Подвисание формы во время выполнения цикла...(#2) RE2ALL 


Vladimir K.   (2002-03-09 03:25) [0]

Заранее извиняюсь, за то, что не мог ответить на ваши соббщения ( http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1014342176&n=0). Из-за проблем у провайдера я смог прочитать все ваши соббщения только 8 марта ;( Спасибо всем за время, потраченное на обсуждение этой проблемы.
Теперь к делу..


Виктор Щербаков © (22.02.02 09:16)
application.processmessages; - помогает только частично
Подробнее!


Задержка на реакцию от событий onclick, onmousemove и.т.п. компонентов находящихся на форме; Задержка перед попыткой претащить форму за заголовок и.т.д.


VictorT (22.02.02 11:00)
Я так понял, что ты имеешь в виду, что пока не закончится некий достаточно // длинный процесс, форма не реагирует на события (нажатие кнопок и т.п.). Это //решается помещением этого процесса в отдельный поток (tread).


Помещение процесса в поток не дало результата =( Возможно я что-то сделал неправильно, но в отношении моей проблемы эффект был незаметным.


Т.е. я так понимаю, работа цикла все-же не очень продолжительная - например, // 15 секунд, в течение которго крутиться прогресс бар.


Время выполнения цикла может колебаться от 20-30 секунд, до нескольких часов, в зависимости от переданных параметров. Важна мгновенная, не "заторможенная" реакция на события от нажатия кнопок, получения фокуса ввода и.т.д. Такой компонент как прогрессбар не влияет на общую работу программы, да и к тому же с ним обычно проблем нет (progressbar.update).


Артемий © (22.02.02 07:03)
Цикл плиз.


к примеру используется цикл:

for i:= q to w do
begin
{ .. }
end;

параметры q и w не константы.



Johnmen   (2002-03-09 03:29) [1]

Я немного не в курсе - в чем вопрос ?



Vladimir K.   (2002-03-09 06:01) [2]

Johnmen - http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1014342176&n=0

А кратко смысл в том, как сделать чтобы во время выролнения цикла форма не подвисала? application.processmessages - решает проблему частично, т.к. заторможенность на нажатие кнопок итд все равно наблюдается =( Оформления процесса как поток не помогло (может я криво сделал).



Anatoly Podgoretsky   (2002-03-09 09:08) [3]

application.processmessages решает ее полностью, с частотой вызова. Что делается в цикле, что юы даже максимальный цикд от 0 до MaxInt выполнялся несколько часов, вот с этим и надо бороться, возможно нужен поток.



Набережных С.   (2002-03-09 10:50) [4]


> Vladimir K. (09.03.02 06:01)

А покажи, как сделал. И сам цикл тоже.



Vladimir K.   (2002-03-10 03:30) [5]

Набережных С.:


for i_:=1 to _i do
begin
yield;
_A.sin_port:=htons(ms[i_]);
sb.SimpleText:= "inttostr(ms[i_]);
tri.Hint:= inttostr(ms[i_]);
if connect(_S,_A,sizeof(_A))=0 then
begin
m.lines.add("["+timetostr(time)+"] Port "+inttostr(ms[i_])+" opened.");
_S:=socket(AF_INET,SOCK_STREAM,0);
end;
application.processmessages;
end;



Anatoly Podgoretsky   (2002-03-10 09:43) [6]

У тебя внутри цикла выполняется длительная по времени операция, надо менять логику программы, Уходить от цикла и использовать потоки (цикл если нужен должен быть в потоке) или ассинхронные операции.



Набережных С.   (2002-03-10 09:45) [7]

Попробуй как-то так:

procedure TMyThread.Execute;
var
p1,p2:PChar;
begin
for i_:=1 to _i do
begin
yield;
_A.sin_port:=htons(ms[i_]);
if connect(_S,_A,sizeof(_A))=0 then
begin
p1:=StrAlloc(64);
p2:=StrAlloc(16);
p1:=StrLCopy(p1,pChar("["+timetostr(time)+"] Port "+inttostr(ms[i_])+" opened."),63);
p2:=StrLCopy(p2,pChar(inttostr(ms[i_]),15);
while not PostMessage(Form1.Handle,MY_PORTMSG,HParam(P1),LPARAM(p2)) do;
_S:=socket(AF_INET,SOCK_STREAM,0);
end;
end;
end;

А в форме:

procedure TForm.MYPORTMSG(var Msg: TMessage);
begin
m.lines.Add(PChar(Msg.HParam));
sb.SimpleText:= pChar(Msg.LParam);
tri.Hint:=sb.SimpleText;
StrDispose(pChar(Msg.HParam));
StrDispose(pChar(Msg.LParam));
end;

Убедись, что IsMultiThread = true.
P.S.Надеюсь, ты знаешь, что делаешь.



Vladimir K.   (2002-03-11 06:19) [8]

Спасибо за пример, буду пробовать..
Только мне кажется, что процедуру TMyThread.Execute следует переименовать в TMyThread.DoWork. В TMyThread.Execute написать:

procedure TMyThread.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;

Вполне возможно, что я ошибаюсь..

PS: Cпасибо за идею с PostMessage.



Polevi   (2002-03-11 11:20) [9]

Ты ошибаешься
В твоем случае ф-ия DoWork будет выполняться в основном потоке приложения - какой смысл создавать поток ?



Набережных С.   (2002-03-11 17:23) [10]


> Vladimir K. (11.03.02 06:19)

Polevi © (11.03.02 11:20) прав. Тогда уж так:

procedure TMyThread.Execute;
var
p1,p2:PChar;
begin
i:=0;
while (i < _i)and not Terminated do
begin
Inc(i);

и далее. И не только это. Я написал "как-то так" а не "точно так". Приспосабливай к своей задаче. Мне ведь не известно, что у тебя делается. Например, yield - функция из API? Так она в Win32 вроде не работает.



Vladimir K.   (2002-03-12 06:01) [11]

насчет yield - вроде работает под win32..

Попытаюсь изменить сам принцип работы цикла и передачу параметров в цикл... Кстати, возможно ли такое, что проблема с подтормаживанием во время выполнения цикла из-за криво написанного компонента? Я использую FlatStyle ( http://www.flatstyle.de). Например прогрессбар от FlatStyle при запуске цикла начинает "мелькать" и "дергаться", в отличии от стандартного прогрессбар палитры компонентов Delphi, который ведет себя отлично.



Anatoly Podgoretsky   (2002-03-12 21:24) [12]

Из за криво написанного компонент может происходить что угодно, вкдчая полное разрушение диска.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.018 c
1-80512           Socol                 2002-03-06 08:00  2002.03.25  
Скрытие формы


3-80422           civ                   2002-02-26 20:04  2002.03.25  
База данных IB


7-80708           3d[Power]             2001-12-21 11:17  2002.03.25  
окна...


3-80411           toorick               2002-02-26 14:08  2002.03.25  
SQL и MEMO-поля


3-80392           SOLDIK                2002-02-26 07:04  2002.03.25  
как включить/выключить триггер