![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сейчас буду канючить. Не могу разобраться с пулом потоков [D6, Win95/98, WinME, Win2k, WinXP]
Граф © (2002-10-21 14:56:00)Задача такова - как создать n однотипных потоков (в моем случае скачивание файлов, понятно, разных файлов). Должна существовать возможность взять информацию из каждого потока (сколько процентов файла скачалось) и приостановить/удалить этот поток.
То есть у каждого потока из пула должен быть какой-то id, чтобы можно было обращаться именно к нему.
Перелопатил все, до чего дотянулся (читай - весь инет). Ничего толком не нашел, кроме, может быть, TIdThreadMgrPool из стандартного набора Indy. Но как им пользоваться, ума не приложу, точнее не могу создать набор действий для потока из пула (не знаю где это сделать).
Кто может, подскажите как подступиться к этой задаче.
Если я был не прав, и Indy здесь не прокатит, подскажите, что прокатит.
VaS (2002-10-21 19:34:00) [1]Ну, можно вместо массива на каждый поток сделать public-функцию, возвращающую структуру со всей необходимой информацией о прогрессе, которая сама защищает считываемые поля кр. секцией, объявленной в классе нитки.
Игорь Шевченко (2002-10-21 17:56:00) [2]Граф © (21.10.02 17:27)
Массив. А каждый поток кладет свое значение прогресса в элемент массива, по мере того самого прогресса. Массив желательно защитить критической секцией.
Граф (2002-10-21 17:27:00) [3]to Игорь Шевченко ©
"опрашивать его" - динамический массив с текущими значениями прогресса или поток?
Игорь Шевченко (2002-10-21 17:13:00) [4]Граф © (21.10.02 16:36)
Можно. Аналог Napster"a пишем ?
Тогда я бы рекомендовал создать дин. массив для текущих значений прогресса для каждого потока, и периодически, по таймеру опрашивать его и отображать данные в ListView.
Smithson (2002-10-21 16:43:00) [5]Synchronyze(ShowWork); - Это в тексте потока
А ShowWork - процедура без параметров, принадлежит потоку, имеет доступ к его данным (в том числе к Handle), но выполняется в контексте основного потока, посему моджет безболезненно иметь доступ к данным форм и объектов VCL.
Граф (2002-10-21 16:42:00) [6]это я про массив с потоками
Граф (2002-10-21 16:36:00) [7]а можно как-то из процедуры потока определить порядковый номер этого потока, чтобы отослать данные о ходе выполнения потока в ствою строку ListVew? А то он в последнюю строку всегда отсылает
panov (2002-10-21 16:05:00) [8]Также можно для синхронизации использовать посылку windows-сообщений форме (PostMessage), а в ней обрабатывать сообщения...
REA (2002-10-21 15:44:00) [9]Не используй в потоке вызовов VCL и особенно ProgressBar. На худой конец вызывай через Synchronize
Smithson (2002-10-21 15:33:00) [10]Пиши просто IF Terminated then exit.
Ведь поток всегда имеет доступ к своим полям
Граф (2002-10-21 15:28:00) [11]попробывал с массивом, не получается вот из-за чего - когда я уничтожаю поток методом 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;
REA (2002-10-21 15:27:00) [12]А еще есть ThreadPool на уровне системы (сам не пользовался)
В принципе, если не сервер пишешь, то сам процесс создания/убивания потоков много не отъест.
TObjectList подходит или TCollection - там и ID вроде есть.
Когда будешь брать информацию о потоке используй объекты синхронизации.
Граф (2002-10-21 15:16:00) [13]Большое Графское спасибо Вам
Separator (2002-10-21 15:12:00) [14]ну можно и так
Гриф (2002-10-21 15:09:00) [15]HANDLE потоков запихать в TList и всё тут.
Separator (2002-10-21 15:07:00) [16]почитай про динамические массивы.
Separator (2002-10-21 15:07:00) [17]Ага, если я тебя правильно понял, то тебе просто нужно запускать 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.
Это просто пример.
Граф (2002-10-21 15:02:00) [18]забыл уточнить, n (число потоков) - заранее не известно
Граф (2002-10-21 15:01:00) [19]с этого места поподробнее пожалуйста? Динамическим массивом?
Каждый элемент массива - поток класса TThreadCopyThisFuckedFile.
Я правильно понял?
Separator (2002-10-21 14:57:00) [20]масивом