Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1231108743
Германн
2009-01-05 01:39
2009.03.15
Запуск служб в WinXP


15-1231518811
programmer90
2009-01-09 19:33
2009.03.15
Оптимизация Интернет Соединения


6-1200778609
VoV_I_K
2008-01-20 00:36
2009.03.15
Как передать событие из Jscript в приложение?


3-1216156374
jane
2008-07-16 01:12
2009.03.15
метод Close для ADODataSet вызывает ошибку BOF или EOF имеет ...


2-1232693950
И. Павел
2009-01-23 09:59
2009.03.15
Как скопировать TADOQuery





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