Форум: "Основная";
Текущий архив: 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]Из за криво написанного компонент может происходить что угодно, вкдчая полное разрушение диска.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c