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

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

Обмен значениями между потоками


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;


Даа, а зачем тебе поток тогда?

События знаешь что такое? Вот с помошью них все проблемы решаться…


Наверх

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