Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-80386
ava
2002-02-25 23:05
2002.03.25
В чем ошибка


3-80402
Eto
2002-02-26 10:52
2002.03.25
Подключение к Excel через BDE


1-80529
Лена
2002-03-13 10:05
2002.03.25
Построение графика в Chart


1-80557
Lion
2002-03-09 23:49
2002.03.25
StringGrid


14-80681
Andrews
2002-02-12 12:03
2002.03.25
А когда у сайта день рождения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский