Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.02.2009, 21:56
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Вопрос Многопоточность...

Потоки... Вроде разобрался... Создаю потоки для закачки нескольких файлов из интернета компонентой idHTTP... Все работает идеально!.. Вот только ограничить количество потоков ни как не могу... Мне надо что бы например максимальное количество потоков было 5... И если создается 6, 7, 8, 9 и т.д. и т.п.. То они ожидали пока для них освободиться место... Заранее благодарен за ответы...
Ответить с цитированием
  #2  
Старый 21.02.2009, 23:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Например, введи глобальный счетчик. Только работу с ним делай через критическую секцию. При старте поток инкрементирует этот счетчик, а при завершении декрементирует. Новый поток не стартует, пока значение счетчика больше или равно какому-либо значению.


Еще можно воспользоваться специальным компонентом типа TThreadList (дополнительным, хотя, вроде в той же Indy такой есть). Найди реализацию, умеющую контролировать кол-во потоков.
Ответить с цитированием
  #3  
Старый 22.02.2009, 08:47
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Восклицание

Конечно спасибо... Принцип мне сам понятен... Мне не понятно как это организовать на примере... У меня получается так что потоки у меня создаются циклически!.. То есть мне либо как то нужно остановить цикл... Либо запускать потоки которые будут уже остановлены... Вот если бы небольшой пример... Заранее спасибо!..
Ответить с цитированием
  #4  
Старый 02.03.2009, 15:53
Zeitgeist7 Zeitgeist7 вне форума
Прохожий
 
Регистрация: 27.02.2009
Сообщения: 5
Репутация: 10
По умолчанию

та же трабла... помогите кто нить поласта! у меня вызов потока идёт циклически. то есть за мгновение создаётся около 5 сотен скачиваний файлов. как сделать так чтобы цикл запустил первый поток, подождал его завершения и запустил следующий?
Ответить с цитированием
  #5  
Старый 02.03.2009, 16:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Zeitgeist7
та же трабла... помогите кто нить поласта! у меня вызов потока идёт циклически. то есть за мгновение создаётся около 5 сотен скачиваний файлов. как сделать так чтобы цикл запустил первый поток, подождал его завершения и запустил следующий?

У потока есть метод WaitFor. он отработает, когда поток закончит работу.
Ребята, ну поищите компонент типа TThreadList и контролируйте кол-во запущеных потоков через него. Типа, если уже запущено пять потоков, то ждать, пока хоть один не завершится.
Ответить с цитированием
  #6  
Старый 02.03.2009, 16:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Romix
Конечно спасибо... Принцип мне сам понятен... Мне не понятно как это организовать на примере... У меня получается так что потоки у меня создаются циклически!.. То есть мне либо как то нужно остановить цикл... Либо запускать потоки которые будут уже остановлены... Вот если бы небольшой пример... Заранее спасибо!..

Много писать придется... т.е. тут простеньким примеров в 10 строчек не получится.

Смысл такой. Тело потока имеет внешний цикл (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  
Старый 03.04.2009, 21:14
Romix Romix вне форума
Начинающий
 
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
Хорошо

Код:
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  
Старый 03.04.2009, 21:45
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А помоему, ни фига не жёстко и не грубо. я бы так же оформлял.
ИМХО.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter