Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


cruiser ©   (2009-01-22 21:15:00) 

Здравствуйте! 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;


cruiser   (2009-01-23 18:15:00) [1]

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


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


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


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


>1.

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

>3.

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


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


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


cruiser   (2009-01-23 12:44:00) [3]

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


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


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

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


kami   (2009-01-22 22:52:00) [5]

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


cruiser   (2009-01-22 21:56:00) [6]

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


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

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

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

3. Убрать FreeOnTerminate=True

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


cruiser   (2009-01-22 21:35:00) [8]

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


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

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


cruiser   (2009-01-22 21:33:00) [10]

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо