Вниз
Скачать: 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.022 c
1-1083261874
Nous Mellon
2004-04-29 22:04
2004.05.16
Нестандартный ЛистВью


1-1083251300
Smog
2004-04-29 19:08
2004.05.16
Разделение строки на подстроки


1-1083487487
mr.Delphin
2004-05-02 12:44
2004.05.16
Диалог


1-1083332455
Просто Я
2004-04-30 17:40
2004.05.16
Отчет из *.exe (FastReport)


6-1080231779
Вика
2004-03-25 19:22
2004.05.16
авторизация и клиент-сервер MIDAS




   Наверх