Главная страница
    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
6-1080020357
Ламерочек
2004-03-23 08:39
2004.05.16
email


3-1082554981
Ega23
2004-04-21 17:43
2004.05.16
Access - возможно ли создание хранимых процедур?


6-1080652780
Новичёк
2004-03-30 17:19
2004.05.16
Использование буфера при ClientRead.


8-1077878817
Spartak
2004-02-27 13:46
2004.05.16
Отчистка картинки


3-1082356405
desha
2004-04-19 10:33
2004.05.16
IBExpert стал зависать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский