Текущий архив: 2002.10.31;
Скачать: CL | DM;
Вниз
Сейчас буду канючить. Не могу разобраться с пулом потоков Найти похожие ветки
← →
Граф © (2002-10-21 14:56) [0]Задача такова - как создать n однотипных потоков (в моем случае скачивание файлов, понятно, разных файлов). Должна существовать возможность взять информацию из каждого потока (сколько процентов файла скачалось) и приостановить/удалить этот поток.
То есть у каждого потока из пула должен быть какой-то id, чтобы можно было обращаться именно к нему.
Перелопатил все, до чего дотянулся (читай - весь инет). Ничего толком не нашел, кроме, может быть, TIdThreadMgrPool из стандартного набора Indy. Но как им пользоваться, ума не приложу, точнее не могу создать набор действий для потока из пула (не знаю где это сделать).
Кто может, подскажите как подступиться к этой задаче.
Если я был не прав, и Indy здесь не прокатит, подскажите, что прокатит.
← →
Separator © (2002-10-21 14:57) [1]масивом
← →
Граф © (2002-10-21 15:01) [2]с этого места поподробнее пожалуйста? Динамическим массивом?
Каждый элемент массива - поток класса TThreadCopyThisFuckedFile.
Я правильно понял?
← →
Граф © (2002-10-21 15:02) [3]забыл уточнить, n (число потоков) - заранее не известно
← →
Separator © (2002-10-21 15:07) [4]Ага, если я тебя правильно понял, то тебе просто нужно запускать n-ое количество однотипных потоков, но выполняющих немного разные функции. Я для такого использую динамический массив. Например:
type
TMyThread = class (TThread)
... //его описание
end;
var
Ar: array of TMyThread;
n: word;
begin
n:= 5;
SetLength(Ar, n);
Ar[1]:= TMyThread.Create(false);
Ar[2]:= TMyThread.Create(false);
end.
Это просто пример.
← →
Separator © (2002-10-21 15:07) [5]почитай про динамические массивы.
← →
Гриф (2002-10-21 15:09) [6]HANDLE потоков запихать в TList и всё тут.
← →
Separator © (2002-10-21 15:12) [7]ну можно и так
← →
Граф © (2002-10-21 15:16) [8]Большое Графское спасибо Вам
← →
REA © (2002-10-21 15:27) [9]А еще есть ThreadPool на уровне системы (сам не пользовался)
В принципе, если не сервер пишешь, то сам процесс создания/убивания потоков много не отъест.
TObjectList подходит или TCollection - там и ID вроде есть.
Когда будешь брать информацию о потоке используй объекты синхронизации.
← →
Граф © (2002-10-21 15:28) [10]попробывал с массивом, не получается вот из-за чего - когда я уничтожаю поток методом Terminate, и проверяю непосредственно в процедуре потока, уничтожен ли данный поток, не понятно, как заставить выйдти тз цикла именно поток указанный поток (сопределенным номером).
В общем:
repeat
if LANCopyFile [n].Terminated then exit;
FromFS.Seek(ToSize, soFromBeginning);
ToFS.CopyFrom(FromFS, count);
ToSize:=ToSize+count;
Form1.ProgressBar1.StepIt;
until FromSize<=ToSize+count;
← →
Smithson © (2002-10-21 15:33) [11]Пиши просто IF Terminated then exit.
Ведь поток всегда имеет доступ к своим полям
← →
REA © (2002-10-21 15:44) [12]Не используй в потоке вызовов VCL и особенно ProgressBar. На худой конец вызывай через Synchronize
← →
panov © (2002-10-21 16:05) [13]Также можно для синхронизации использовать посылку windows-сообщений форме (PostMessage), а в ней обрабатывать сообщения...
← →
Граф © (2002-10-21 16:36) [14]а можно как-то из процедуры потока определить порядковый номер этого потока, чтобы отослать данные о ходе выполнения потока в ствою строку ListVew? А то он в последнюю строку всегда отсылает
← →
Граф © (2002-10-21 16:42) [15]это я про массив с потоками
← →
Smithson © (2002-10-21 16:43) [16]Synchronyze(ShowWork); - Это в тексте потока
А ShowWork - процедура без параметров, принадлежит потоку, имеет доступ к его данным (в том числе к Handle), но выполняется в контексте основного потока, посему моджет безболезненно иметь доступ к данным форм и объектов VCL.
← →
Игорь Шевченко © (2002-10-21 17:13) [17]Граф © (21.10.02 16:36)
Можно. Аналог Napster"a пишем ?
Тогда я бы рекомендовал создать дин. массив для текущих значений прогресса для каждого потока, и периодически, по таймеру опрашивать его и отображать данные в ListView.
← →
Граф © (2002-10-21 17:27) [18]to Игорь Шевченко ©
"опрашивать его" - динамический массив с текущими значениями прогресса или поток?
← →
Игорь Шевченко © (2002-10-21 17:56) [19]Граф © (21.10.02 17:27)
Массив. А каждый поток кладет свое значение прогресса в элемент массива, по мере того самого прогресса. Массив желательно защитить критической секцией.
← →
VaS © (2002-10-21 19:34) [20]Ну, можно вместо массива на каждый поток сделать public-функцию, возвращающую структуру со всей необходимой информацией о прогрессе, которая сама защищает считываемые поля кр. секцией, объявленной в классе нитки.
Страницы: 1 вся ветка
Текущий архив: 2002.10.31;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.009 c