Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.032 c
9-1071754582
zzet
2003-12-18 16:36
2004.05.16
FullScreen OpenGl


1-1083130700
Denis Davidoff
2004-04-28 09:38
2004.05.16
Delphi 8 капризничает


1-1083177631
killer
2004-04-28 22:40
2004.05.16
Кнопочка в StringGrid


6-1080127550
rimd
2004-03-24 14:25
2004.05.16
idSMTP and idAntifreez


7-1081344370
killer
2004-04-07 17:26
2004.05.16
ShellApi ShellExecute





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский