Цитата:
Сообщение от 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;
Схема упрощенная и только с одним потоком. Придумана "навскидку". Но подобный механизм используется в одной моей программе. Только там несколько потоков, так что приходится работать со счетчиком.
Если надо просто контрорлировать кол-во потоков, то тут надо писать соответсвующий менеджер.