Показать сообщение отдельно
  #6  
Старый 02.03.2009, 16:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия 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;

Схема упрощенная и только с одним потоком. Придумана "навскидку". Но подобный механизм используется в одной моей программе. Только там несколько потоков, так что приходится работать со счетчиком.
Если надо просто контрорлировать кол-во потоков, то тут надо писать соответсвующий менеджер.
Ответить с цитированием