Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];
ВнизОжидание отработки операций внутри отдельного потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c