Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

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

 
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;


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

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


 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
2-1181835250
Bullfrog
2007-06-14 19:34
2007.07.08
edit


15-1180739061
Kostafey
2007-06-02 03:04
2007.07.08
С днем рождения ! 2 июня


2-1181918880
deras
2007-06-15 18:48
2007.07.08
Как "очистить" датасет?


1-1178460987
sinus
2007-05-06 18:16
2007.07.08
ANSII ( кодировка ДОС ) в ANSI ( кодировка Win )


11-1165150697
Stan
2006-12-03 15:58
2007.07.08
Не работает Applet.OnMessage