![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Потоки... Вроде разобрался... Создаю потоки для закачки нескольких файлов из интернета компонентой idHTTP... Все работает идеально!.. Вот только ограничить количество потоков ни как не могу... Мне надо что бы например максимальное количество потоков было 5... И если создается 6, 7, 8, 9 и т.д. и т.п.. То они ожидали пока для них освободиться место... Заранее благодарен за ответы...
|
#2
|
|||
|
|||
![]() Например, введи глобальный счетчик. Только работу с ним делай через критическую секцию. При старте поток инкрементирует этот счетчик, а при завершении декрементирует. Новый поток не стартует, пока значение счетчика больше или равно какому-либо значению.
Еще можно воспользоваться специальным компонентом типа TThreadList (дополнительным, хотя, вроде в той же Indy такой есть). Найди реализацию, умеющую контролировать кол-во потоков. |
#3
|
|||
|
|||
![]() Конечно спасибо... Принцип мне сам понятен... Мне не понятно как это организовать на примере... У меня получается так что потоки у меня создаются циклически!.. То есть мне либо как то нужно остановить цикл... Либо запускать потоки которые будут уже остановлены... Вот если бы небольшой пример... Заранее спасибо!..
|
#4
|
|||
|
|||
![]() та же трабла... помогите кто нить поласта! у меня вызов потока идёт циклически. то есть за мгновение создаётся около 5 сотен скачиваний файлов. как сделать так чтобы цикл запустил первый поток, подождал его завершения и запустил следующий?
|
#5
|
|||
|
|||
![]() Цитата:
У потока есть метод WaitFor. он отработает, когда поток закончит работу. Ребята, ну поищите компонент типа TThreadList и контролируйте кол-во запущеных потоков через него. Типа, если уже запущено пять потоков, то ждать, пока хоть один не завершится. |
#6
|
|||
|
|||
![]() Цитата:
Много писать придется... ![]() Смысл такой. Тело потока имеет внешний цикл (While not Terminated) и внутренний. Внутренний работает только тогда, когда есть задание для потока. Код:
type TMyThread = class(TThread) ... public IsBuzy : Boolean; // Флаг того, что задаение есть и выполняется Data : TData; // Данные, которые надо обработать end; procedure TMyThread.Execute; begin // Внешний цикл. Пока он выполняется, поток "жив" While Not Terminated Do Begin If IsBuzy Then Begin // Задание есть - работаем. DoSomeThing(Data); IsBuzy := False; // Все сделали End; // Задания нет. Подождем, пока появится Sleep(500); End; end; Ну и как этим пользоваться. Код:
procedure TForm1.Button1Click(Sender : TObject); var T : TMyThread; begin T := TMyThread; T.FreeOnTerminate := True; // Когда все сделаем, поток нам больше не нужен. For I := 0 To XXX Do Begin While T.Buzy Do Begin // Поток занят - ждем когда отработает и освободится Sleep(100); Application.ProcessMessages; End; // Дали потоку работу и запустили на выполнение. T.Data := XXX; T.Buzy := True; End; end; Схема упрощенная и только с одним потоком. Придумана "навскидку". Но подобный механизм используется в одной моей программе. Только там несколько потоков, так что приходится работать со счетчиком. Если надо просто контрорлировать кол-во потоков, то тут надо писать соответсвующий менеджер. |
#7
|
|||
|
|||
![]() Код:
procedure TDownLoadHttp.Execute; var IdHttp: TIdHTTP; TFS00: TFileStream; begin while ThreadCount >= MaxThreadCount do begin Application.ProcessMessages; end; ThreadCount:=ThreadCount + 1; for AE:=1 to AttemptsErrors do begin Try IdHttp:=TIdHTTP.Create(nil); IdHttp.HandleRedirects:=True; TFS00:=TFileStream.Create(InFile, fmCreate); IdHttp.Get(Url, TFS00); Break; Finally IdHttp.Free; TFS00.Free; end; Application.ProcessMessages; end; ThreadCount:=ThreadCount - 1; end; Я сделал так... Может грубовато!... Но все работает и не глючит!... Количество потоков контролируется жестко!... Может и глупо.. Но все же... Спасибо всем... |
#8
|
||||
|
||||
![]() А помоему, ни фига не жёстко и не грубо. я бы так же оформлял.
ИМХО. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |