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

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

Кстати, хочу заметить, что в настоящее без программ любым пользователем ПК не обойтись, тем более многопоточных, которые очень производительны. Вообще программы создаются очень быстро и они относятся к разным видам ПО. Чтобы Вам Скачать программы — необходимо иметь просто выход в сеть Интернет, после чего Вы можете качать абсолютно все программы, под Ваши нужды и Ваши профессиональные навыки.

Исходники статьи качаем тут

Автор статьи - Andrey53

Метки: , ,




К записи “Создание много потоков в приложении” оставлено комментариев: 11.

  1. Сергей:

    Ну кто так пишет? Вы бы хоть почитали что-нибудь серьезное о работе потоков.
    NewThread.Resume;
    NewThread.count:=StrToInt(ListBox2.Items[i]);
    Объясните как это будет работать?
    Во первых после вызова метода Resume в потоке сразу же запускается процедура Execute и соответственно запуститься ваш цикл с неопределенной переменной Count. Что бы это работало, нужно строчки поменять местами.
    Во вторых начиная с Delphi 2010 (или c 2009) метод Resume запускать не следует, правильнее будет использовать процедуру Start.
    В третьих — где функция уничтожающая все работающие в данный момент потоки? Например: в какой-либо момент у нас еще работает 500 потоков, а основное приложение закрывают, что в этом случае будет? Нужно обязательно знать о том, какие потоки в текущий момент работаю, чтобы в случае необходимости уничтожить их.

    Советую почитать статьи по блокировкам потоков, например вот эту: http://forum.vingrad.ru/topic-.....80344.html

  2. avg:

    Надо не только над кодом поработать, но и стиль изложения существенно править. Похоже, что писал человек для которого русский язык не является родным. Весьма косноязычно.

  3. Андрей:

    Это также писал человек, который не понимает, что важную роль при презентации материала играет форматирование исходного кода. Если такое показывать друзьям, то роли не играет, а если общественности, то нужно учитывать что все люди разные. Ориентиром должно быть форматирование VCL…

  4. Дмитрий:

    Также, вмсето замучившего душу программистов обычного Synchronize(тут метод класса) лучше Synchronize(begin
    Form1.ListBox1.Items.Add(IntToStr(а тут можно использовать локальную переменную));
    end;)

  5. ter:

    самая интересная фраза была такая

    То есть мы передаем одному и тому же потоку разные значения в итоге у нас получается много потоков

  6. nmd:

    TestThread=class(TThread)
    private
    count,sum:integer;

    NewThread.count:=StrToInt(ListBox2.Items[i]);
    зачем в private загоняли?

    FCount,FSum:integer; пишут в классе!(не правило, но хороший тон)

  7. GlooK:

    Пример многопочточности при HTTP запросах можно посмотреть здесь.

  8. psiho:

    Хотелось бы, чтобы Вы описали многопоточность при работе с базами данных. Если конкретно, то интересует выполнение запроса ADOQuery в нескольких потоках и обработка их результатов.

  9. maxteam:

    Сергей,nmd,Дмитрий — эсли вы такие профи,то зачем читаете этот пост?

  10. Удав Анаконда:

    maxteam, все нормально. Я лично узнал из коментов больше, чем из статьи

Оставить комментарий на ter

Вы можете использовать следующие теги:

*