Форум: "Основная";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
ВнизОбмен значениями между потоками Найти похожие ветки
← →
nali (2007-05-08 12:27) [0]В главном модуле обьявлена глобальная переменная url, в которую устанавливаю значение перед созданием потока, потом создаю поток и в методе Execute проверяю переменную url , а она почему-то пустая. Короче вот приблизительный код:
Главный модуль:
Unit Unit1;
interface
.
.
.
var
url:string;
ThreadDownload_Done:Boolean=true;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
ThreadDownload_Done:=false; // поток запущен
url:="http://www.server.com/file.htm";
ThreadDownload:=TThreadDownload.Create(false);
while true do
begin
Application.ProcessMessages;
if ThreadDownload_Done then // если поток закончен - выходим
begin
break;
end;
sleep(100);
end;
...
end;
end.
Модуль потока:
unit Unit_Download;
interface
type
TThreadDownload = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
function DownLoadFile:Boolean;
procedure ThreadDone(Sender: TObject);
...
end;
var
ThreadDownload: TThreadDownload;
implementation
uses Unit1;
procedure TThreadDownload.Execute;
begin
OnTerminate:=ThreadDone;
DownLoadFile;
end;
function TThreadDownload.DownLoadFile;
// закачка файла с сервера
begin
// здесь url="" , хотя в основном потоке устанавливал значение
FreeOnTerminate := True;
result:=false;
// далее идет закачка файла
...
end;
procedure TThreadDownload.ThreadDone(Sender: TObject);
begin
ThreadDownload_Done:=true;
end;
end.
Вопрос: Почему переменная url пустая и как обмениватся значениями между потоками ?
← →
Kolan © (2007-05-08 12:31) [1]> while true do
> begin
> Application.ProcessMessages;
> if ThreadDownload_Done then // если поток закончен
> — выходим
> begin
> break;
> end;
> sleep(100);
> end;
Даа, а зачем тебе поток тогда?
События знаешь что такое? Вот с помошью них все проблемы решаться…
← →
Ega23 © (2007-05-08 12:47) [2]Капец.
Про потоко-защищённые данные что-нибудь слышал?
← →
Reindeer Moss Eater © (2007-05-08 12:52) [3]ThreadDownload:=TThreadDownload.Create(false);
1. Вызывать конструктор надо с параметром false.
2. После создания присваивать паблик полю потока значение урл.
3. Делать потоку resume.
Либо вообще нарисовать свой конструктор с параметром url
← →
DVM © (2007-05-08 12:54) [4]
> и как обмениватся значениями между потоками?
В поток можно передать значение с конструктором, или в объекте потока сделать защищенные критическими секциями свойства. Обращаться к полям только через эти свойства как снаружи так и внитри потока.
Из потока можно передать значение с пом сообщения или Synchronize
← →
nali (2007-05-08 13:06) [5]Спасибо, попробую до запуска потока передавать значения в поток через его поля, а обратно через Synchronize.
← →
Reindeer Moss Eater © (2007-05-08 13:10) [6]1. Вызывать конструктор надо с параметром false.
то есть наоборот с true. Иначе он сразу начнет выполняться
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c