Текущий архив: 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.47 MB
Время: 0.036 c