Вниз
Скачать: CL | DM;

Синхронизация потоков , нужна помощь   Найти похожие ветки 

 
Tishaishy ©   (2004-05-02 11:26) [0]

Хочу скопировать несколько файлов одновременно,а работает только последний запущенный поток, остальные чего-то ждут , как только последний запущенный завершается, то начинает работать предпоследний и т.д.

//=== Program=========
THTTPThread = class(TThread)
 private
  URL: string;
 protected
    procedure Execute; override;
    procedure DoConnectCopy;
end;

procedure THTTPThread.Execute;
begin

 Synchronize(DoConnectCopy);

end;
//===================================
procedure THTTPThread.DoConnectCopy;

begin
     {CODE Connecta i COpyrovania}
end;

//==========================================
procedure TForm1.ToolButtonStartClick(Sender: TObject);

var i:integer;
Begin

  for i := 0 to ListBox1.Items.Count-1 do begin
 
   with THTTPThread.Create(True) do begin
 
     URL := ListBox1.Items[i];
     Resume;
   end;

 end;

end;


 
Cobalt ©   (2004-05-02 11:36) [1]

>>> Synchronize(DoConnectCopy);
Эээ, товарищ, зачем же вы так делаете???
Вы, видимо, непрочитали комментарии насчёт  Synchronize() - туда надо выносить только! обращения к компонентам  и другим объектам, которые разделяются между ВСЕМИ потоками - для того, чтобы не было доступа к одному объекту одновременно у нескольких потоков


 
Юрий Зотов ©   (2004-05-02 11:36) [2]

Ответ - в справке по методу Synchronize. Фактически, у Вас работает только один поток - главный. Копировать несколько файлов одновременно он, конечно, не может.


 
Verg ©   (2004-05-02 11:38) [3]

Ждут своей очереди, чтобы закончив DoConnectCopy одного потока, главный поток приступил к DoConnectCopy следующего.
Synchronoze - метод, указанный в его параметре будет выполнен главным потоком.
Т.о. получается, что всю вашу работу делает главный поток, остальные ожидают своей очереди к нему.


 
Ihor Osov'yak ©   (2004-05-02 11:39) [4]

Если коротко -  Synchronize затавляет "подсинхронайзнутую" процедуру, т.е. DoConnectCopy выполнятся в контексте главного потока. Естественно, пока работает DoConnectCopy (в контексте главного потока), то Synchronize остальных потоков будуть "ждать"  на "освобождение" главного потока.

Более подробно - см. исходники VCL, книжки...

Зы. Возможно, что синхронайз здесь вообще не нужно. Ответить на этот вопрос может можно будеть, если взгянуть на код DoConnectCopy..
Зы2. Если нужно закачка файлов - то как альтернатива многопоточной работе - работа в ассинхронном режиме..


 
Ihor Osov'yak ©   (2004-05-02 11:41) [5]

блин, прямо таки конкуренция "отвечающих". На дождь, видать...



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
1-1083072150
Dimitriy
2004-04-27 17:22
2004.05.16
Memo


1-1083140421
Бегун
2004-04-28 12:20
2004.05.16
Приклеить окно к другому окну


1-1083651731
$tranger
2004-05-04 10:22
2004.05.16
Запуск с параметрами


14-1082977640
Малой
2004-04-26 15:07
2004.05.16
Приветствие


9-1073342523
Barlokf
2004-01-06 01:42
2004.05.16
Autorun для игр




   Наверх