Здравствуйте, в этой статье я хотел бы поговорить как можно создать неопределенное количество потоков в своей программе, причем будет объявлен только один поток. Тут все просто они создаются поочередно в цикле и нашему потоку передается какое-то значение, которое присуще только ему. То есть мы передаем одному и тому же потоку разные значения в итоге у нас получается много потоков, в зависимости от количества передаваемых данных и на этом этапе конечно же наступают проблемы, потому что на выполнения каждого потока выделяется какой-то объем памяти, ну примерно может 1 мб, конечно все зависит от самого потока. И вот конечно если Вам необходимо одновременно запустить на обработку данных в 1000 потоков, то Вы прекрасно понимаете сколько будет «скушано» оперативной памяти, конечно постепенно она будет освобождаться при завершении действий потока, что есть очень хорошо, и поэтому мы будем делать так, чтобы поток по завершению работы уничтожался, то есть освобождал оперативную память, тогда у нас программа с нашим большим объемом потоков будет работать довольно быстро и без сбоев.
Ну а теперь давайте приступим к нашим потокам. Я предлагаю сделать поток, который будет складывать в цикле сумму до, которой мы укажем, и данные будут записываться в TListBox.
Итак на форме у меня следующее
- TListBox- 2 шт
- TButton
Теперь давайте посмотрим как будет выглядеть наш сам класс потока. Кстати мы можем его описать сразу в нашем модуле класс потока, либо же создать с помощью мастера. То есть выбираем File-New-Other, далее во вкладке New выбираем Thread Object и нажимаем двойным щелчком, либо по кнопке «Ок», далее в появившемся окне пишем имя нашего потока и нажимаем «Ок», после этого создается модуль нашего потока, мы не забываем в этом случае подключать модуль потока в проект и наоборот, в модуль потока необходимо подключить модуль проекта, так как мы будем использовать данные формы. Но я опишу его в текущем модуле наш поток и он у меня выглядит примерно следующим образом:
type
TestThread=class(TThread)
private
count,sum:integer;
protected
procedure Execute;override;
procedure ShowResult;
end;
- count — количество до тех пор пока мы будем складывать
- sum — сумма, складываемых значений
Далее мы напишем код самих методов нашего потока вначале Execute
procedure TestThread.Execute;
var
i:integer;
begin
inherited;
sum:=0;
for i:=1 to count do
begin
sum:=sum+i;
end;
Synchronize(ShowResult);
end;
Складываем значения, синхронизируем результат все просто. Процедура ShowResult
procedure TestThread.ShowResult;
begin
Form1.ListBox1.Items.Add(IntToStr(sum));
end;
Просто выводим, полученный результат
А на OnClick кнопки мы напишем код, который будет создавать наши потоки, неопределенного количества
procedure TForm1.Button1Click(Sender: TObject);
var
kol,i:integer;
NewThread:TestThread;
begin
for i:=0 to ListBox2.Count-1 do
begin
NewThread:=TestThread.Create(True);
NewThread.FreeOnTerminate:=True;
NewThread.Resume;
NewThread.count:=StrToInt(ListBox2.Items[i]);
end;
end;
Создаем поток, задаем ему, чтобы он после завершение самоуничтожился, чтобы сразу же освободить память компьютера, возобновляем его на всякий случай, а затем задаем ему значение, до которого нам необходимо считать.