Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
14-1084433607
syte_ser78
2004-05-13 11:33
2004.05.30
Что с компом?


1-1084891319
Mameluke
2004-05-18 18:41
2004.05.30
Отображение верхнего и нижнего индексов в TRTFLabel


3-1083839947
Alina
2004-05-06 14:39
2004.05.30
Дата???


3-1084283007
TransparentGhost
2004-05-11 17:43
2004.05.30
Нужно ли в FIB вызывать UnPrepare если меняется SQL-запрос?


1-1084535443
Stas
2004-05-14 15:50
2004.05.30
Как узнать удален компонент или нет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский