Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: 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 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.053 c
1-1083213421
M@X
2004-04-29 08:37
2004.05.16
Перевод с СИ


8-1077368857
able
2004-02-21 16:07
2004.05.16
сравнение картинок


1-1083529948
KEBZ
2004-05-03 00:32
2004.05.16
Text


9-1059490261
Rooo
2003-07-29 18:51
2004.05.16
Как поставить GlScene 09b на Delphi 7?


1-1083224549
denpro
2004-04-29 11:42
2004.05.16
Меню и MDI