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

Вниз

Ожидание отработки операций внутри отдельного потока   Найти похожие ветки 

 
cruiser ©   (2009-01-22 21:15) [0]

Здравствуйте! D2009, WinXP. Подскажите, как можно запустить отдельный поток и дождаться пока он завершиться и только тогда отработать следующую процедуру? В моем коде скачивается файл с сервера интернет и записывается содержимое в переменную. Но мне кажется что организованно это как-то криво. Может есть более элегантные и правильные решения?

procedure TForm1.Button1Click(Sender: TObject);
var
 NewThread: TNewThread;
begin
context:="";
 NewThread:=TNewThread.Create(true);
 NewThread.FreeOnTerminate:=true;
 NewThread.Priority:=tpLower;
 NewThread.Resume;
// здесь надо дождаться результата отработки потока и только потом выдать сообщение
showmessage (context);
end;

procedure TNewThread.Execute;
begin
while context="" do
context:= form3.idhttp1.get("http://www.server.domen/context.ini");
end;


 
Сергей М. ©   (2009-01-22 21:23) [1]

Достоверным фактом завершения работы потока является получение управления после успешного вызова метода TThread.WaitFor


 
Сергей М. ©   (2009-01-22 21:28) [2]

При этом следует понимать, что в случае FreeOnTerminate=True вызов метода WaitFor в другом потоке потенциально опасен возможным AV-исключением.
Во избежание этого следует разрушать поток явно после отработки метода WaitFor.


 
Сергей М. ©   (2009-01-22 21:33) [3]

А зачем тут while-цикл ?


 
cruiser ©   (2009-01-22 21:33) [4]

Спасибо за ответ. Я видел эту функцию TThread.WaitFor, но  так и не понял как ей пользоваться правильно. Подскажите пожалуйста и корректен ли приведенный выше код?


 
cruiser ©   (2009-01-22 21:35) [5]

While цикл для того, что бы при отработке idhttp  программа точно получила данные с сервера и записала в переменную. ну я же говорю, что это скорее всего кривой код и спрашиваю как его оформить по-культурнее :)


 
Сергей М. ©   (2009-01-22 21:43) [6]

1. Убрать context из переменных и сделать ее публичным полем или свойством класса TNewThread

2. Убрать while-цикл

3. Убрать FreeOnTerminate=True

4. Дождаться завершения потока вызовом WaitFor, убедиться что FatalException = nil, получить значение context и после этого разрушить объект-поток вызовом Free


 
cruiser ©   (2009-01-22 21:56) [7]

1. и 3. как это сделать?
4. вот я и спросил ранее, что не понял как использовать WaitFor
Не могли бы Вы помочь и подправить код так, как Вы его видите? Заранее спасибо!


 
kami ©   (2009-01-22 22:52) [8]

Все замечательно и великолепно, но вот не пойму - если основной поток ждет завершения работы вторичного, зачем тогда вообще вторичный поток?


 
Германн ©   (2009-01-23 00:30) [9]


> kami ©   (22.01.09 22:52) [8]
>
> Все замечательно и великолепно, но вот не пойму - если основной
> поток ждет завершения работы вторичного

С чего ты взял, что тут основной поток именно ждёт?


 
cruiser ©   (2009-01-23 12:44) [10]

Поясню.
Все верно. Запуск второго потока происходит из первого, для того что бы не приостанавливать свою работу. Для чего это нужно: запускаем вторичный поток и в нем процедуру загрузки файла. Из файла читаем инфу и передаем в переменную (либо в мемо). Дело в том что если соединение не стабильное или его вообще нет с Интернет и нужным сервером, то если делать эту операцию в основном потоке - он начинает зависать соответственно.
Вот почему сделан отдельный поток.
Кто-нибудь может подсказать, как получить данные что поток завершен и только после этого отработать следующую операцию? или же следующую операцию так же загнать во вторичный поток?
Еще вопрос по waitfor - подскажите как его применить в этом коде и в такой задаче?


 
Сергей М. ©   (2009-01-23 12:52) [11]


> cruiser ©   (22.01.09 21:56) [7]


> 1. и 3. как это сделать?


>1.

Что значит "как"  ?
Ты впервые слышишь про поля и свойстыва класса ?

>3.

А как это присвоение появилось в твоем коде ?
ты этот код сдул откуда-то или сам писал ?
Вот как оно там у тебя появилось, точно так же и убирай его оттуда.


> не понял как использовать WaitFor


Просто взять и вызвать этот метод. Более ничего не требуется.


 
cruiser ©   (2009-01-23 18:15) [12]

ок. я всё понял. попробую сегодня



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1232645435
Tinky
2009-01-22 20:30
2009.03.15
Надо ли обнулять массивы?


2-1233085240
AkimOS
2009-01-27 22:40
2009.03.15
Файл


2-1230782516
VirusO4eK
2009-01-01 07:01
2009.03.15
Свойство формы visible стандартно стоит false. Это нормально?


3-1216200503
too_lamer
2008-07-16 13:28
2009.03.15
Как задать нестандартный порт для подключения к SQL Server в ADO?


3-1216183175
Rav
2008-07-16 08:39
2009.03.15
Как заставить работать ADO в сервисе NT