Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Thread1Execute (При этом не происходит RePaint формы)   Найти похожие ветки 

 
Delphi5.01 ©   (2004-05-11 17:48) [0]

Помогите разобраться с потоками а именно:
Я использую компонент IEHTTP для скачивания странички с интернета (другой компонент не предлагать, есть некие причины), Если скорость слишком маленькая то операция ExecuteURL зависает (работает длительное время). При этом не происходит RePaint формы.
Для решения проблемы ExecuteURL я поместил в поток так, потку дал самый маленький приоритет Idle в надежде что RePaint произойдет, но к моему удивлению даже  он не помог
Привожу пример программы:

Thread.PriorityClass = pcIdle;
Thread.Priority = tpIdle;
Thread.startSuspended = True;

function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
 DownloadURL;
end;

на нажатие кнопки:

procedure TForm1.BitBtn1Click(Sender: PObj);
begin
 Thread.Execute;
end;

Где ошибка?
Спасибо за помощь

П.С. пытался поместить DownloadURL во второй поток и вызвать второй поток из первого, а потом так как первый поток имеет приоритет в цикл загнать Applet.ProcessMessages но по не известной мне причине второй поток забрал приоритет и вернул первому потоку управление только после того как второй закончил свою работу!

function TForm1.Thread1Execute(Sender: PThread): Integer;
var
 Time: Integer;
begin
 Thread2.Execute;
 Time:=GetTickCount;
 while (not Thread2.Terminated)or(GetTickCount-Time<10) do
   begin
     Applet.ProcessMessages;
   end;
 if not Thread2.Terminated then
   Thread2.Suspend;
end;

function TForm1.Thread2Execute(Sender: PThread): Integer;
begin
 DownloadURl;
end;


 
Viman ©   (2004-05-12 09:01) [1]

> Delphi5.01
Так ведь не так поток запускается. :(

...
на нажатие кнопки:

procedure TForm1.BitBtn1Click(Sender: PObj);
begin
Thread.Execute;
end;
...

Все выполнение процедуры Execute проходит в первичном потоке(ну или в том из которого вызывается). Другой поток даже и не запускается(как видно по коду он у тебя Suspended). Чтобы все работало как следует, нужно в вышеописанной процедуре заменить Thread.Execute на Thread.Resume.
Успехов.


 
SPeller ©   (2004-05-12 11:15) [2]

... всмысле в нужном форуме.


 
SPeller ©   (2004-05-12 11:17) [3]

там где троеточие должно было быть "Разберитесь как пользоваться TThread"ом в нужной ветке, ..."


 
Delphi5.01 ©   (2004-05-13 18:55) [4]

SPeller
Blin ia znau kak polzovatsa Threadom, no problema ne v VCL a v KOL, vi cho voobshe odureli, jiru besites cho! ia govoru chto v VCL vso rabotaet, trabli s KOL!
Ili glavnoe postavit galochku, vot ia moderator, i kuda hochu tuda perenesu vetku! mojet u vas s obrazovaniem tugovato, snachala nado utochnit vopros!
Raz razmestil v KOL znachit eta problema poiavilas v KOL!!!!!

A esli na to poshlo, esli budem razmishlak kak ti razmeshlaesh. to etot vopros nado bilo ramzmestit Sistema! Po toi prichine chto krome Thread nado uchest chto danni thread zapuskaek esho tdelni potok kotori obrabativaet HTTP protokol! vot chto i vizivaet problemu. esli vmesto Download napisat while true do to vso rabotaet, a eto znachit chto prablema v Thread + Sistema


 
Delphi5.01 ©   (2004-05-13 20:09) [5]

Удалено модератором


 
Delphi5.01 ©   (2004-05-13 20:11) [6]

Удалено модератором


 
panov ©   (2004-05-13 22:01) [7]

>Delphi5.01 ©

Для обращений к администрации есть специальный адрес.

PS.

По теме ветки:

Вопрос сформулирован непонятно. Проблемный код приведен неполностью или его слишком мало для диагноза.

Просьба сформулировать точнее.

Так как в вопросе звучит, что в VCL всё работает, лучше привести и для VCL код. ВОзможно, там есть ошибки или неточности.


 
Delphi5.01 ©   (2004-05-13 22:05) [8]

Tak esli v VCL vso rabotaet to zachem privodit kod?

P.S. Ia privol kod dla kola, vso chto ia delala dla VCL eto vizival suspend i resume vmesto execute!


 
sniknik ©   (2004-05-14 08:58) [9]

> Где ошибка?
здесь ->  Thread.Execute;
метод  Execute; явно никогда не запускается.

и здесь
function TForm1.Thread1Execute(Sender: PThread): Integer;
...
Thread2.Execute;
и дальше по той же и другим причинам (Applet.ProcessMessages; лишнее в потоке, а код в функции приблизительно такой должен находится внутри метода Execute, а он вынесен вообше за поток)

> [4] [5] [6] [8]
нэ понемену

но обший смысл уловил, думаю. нельзя бездумно переносить код из VCL в потоки скорее всего работать не будет, по разным причинам.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
14-1084446906
Layner
2004-05-13 15:15
2004.05.30
мастера! Есть ли кто спец. по сварочным аппаратам?


1-1084955995
Виталий Джангл
2004-05-19 12:39
2004.05.30
Экспорт данных в MS Word


1-1085039941
Bocman
2004-05-20 11:59
2004.05.30
день и месяц из даты


3-1084364382
Korefey
2004-05-12 16:19
2004.05.30
Delphi, SQL


4-1082210450
сщвук
2004-04-17 18:00
2004.05.30
Task bar