![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обмен значениями между потоками
nali © (2007-05-08 12:27:00)В главном модуле обьявлена глобальная переменная 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 пустая и как обмениватся значениями между потоками ?
Reindeer Moss Eater (2007-05-08 13:10:00) [1]1. Вызывать конструктор надо с параметром false.
то есть наоборот с true. Иначе он сразу начнет выполняться
nali (2007-05-08 13:06:00) [2]Спасибо, попробую до запуска потока передавать значения в поток через его поля, а обратно через Synchronize.
DVM (2007-05-08 12:54:00) [3]
> и как обмениватся значениями между потоками?
В поток можно передать значение с конструктором, или в объекте потока сделать защищенные критическими секциями свойства. Обращаться к полям только через эти свойства как снаружи так и внитри потока.
Из потока можно передать значение с пом сообщения или Synchronize
Reindeer Moss Eater (2007-05-08 12:52:00) [4]ThreadDownload:=TThreadDownload.Create(false);
1. Вызывать конструктор надо с параметром false.
2. После создания присваивать паблик полю потока значение урл.
3. Делать потоку resume.
Либо вообще нарисовать свой конструктор с параметром url
Ega23 (2007-05-08 12:47:00) [5]Капец.
Про потоко-защищённые данные что-нибудь слышал?
Kolan (2007-05-08 12:31:00) [6]> while true do
> begin
> Application.ProcessMessages;
> if ThreadDownload_Done then // если поток закончен
> выходим
> begin
> break;
> end;
> sleep(100);
> end;
Даа, а зачем тебе поток тогда?
События знаешь что такое? Вот с помошью них все проблемы решаться