Создание много потоков в приложении

4 минуты на чтение

Здравствуйте, в этой статье я хотел бы поговорить как можно создать неопределенное количество потоков в своей программе, причем будет объявлен только один поток. Тут все просто они создаются поочередно в цикле и нашему потоку передается какое-то значение, которое присуще только ему. То есть мы передаем одному и тому же потоку разные значения в итоге у нас получается много потоков, в зависимости от количества передаваемых данных и на этом этапе конечно же наступают проблемы, потому что на выполнения каждого потока выделяется какой-то объем памяти, ну примерно может 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;

Создаем поток, задаем ему, чтобы он после завершение самоуничтожился, чтобы сразу же освободить память компьютера, возобновляем его на всякий случай, а затем задаем ему значение, до которого нам необходимо считать.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Всем привет дорогие друзья. Совсем недавно передо мной встала одна проблема: создание слайдов (слайд-шоу) в собственном приложении. Другими словами, необходимо было организовать рекламу из картинок, с различными красивыми переходами, задержкой и так далее. Есл...
Ну вот наконец-то я созрел для написании статьи, где я хочу рассказать о том, как можно скачать файл из Интернет без зависания формы, то есть с использованием потоков. Сказать честно, сам в потоках давно разбираюсь так до конца и не разобрался, но маленькую пр...
И снова здравствуйте, довольно много времени прошло с момента последней публикации по теме MapWindow GIS в Delphi и хочу сказать, что за этот период довольно много изменилось в самой MapWindow GIS. Вышла новая версия, в которой довольно много изменений, а еще ...