Форум: "Основная";
Текущий архив: 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