Здравствуйте, в этой статье я хотел бы поговорить как можно создать неопределенное количество потоков в своей программе, причем будет объявлен только один поток. Тут все просто они создаются поочередно в цикле и нашему потоку передается какое-то значение, которое присуще только ему. То есть мы передаем одному и тому же потоку разные значения в итоге у нас получается много потоков, в зависимости от количества передаваемых данных и на этом этапе конечно же наступают проблемы, потому что на выполнения каждого потока выделяется какой-то объем памяти, ну примерно может 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
Метки: TThread, многопоточные приложения, потоки
Ну кто так пишет? Вы бы хоть почитали что-нибудь серьезное о работе потоков.
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
Надо не только над кодом поработать, но и стиль изложения существенно править. Похоже, что писал человек для которого русский язык не является родным. Весьма косноязычно.
Это также писал человек, который не понимает, что важную роль при презентации материала играет форматирование исходного кода. Если такое показывать друзьям, то роли не играет, а если общественности, то нужно учитывать что все люди разные. Ориентиром должно быть форматирование VCL…
Также, вмсето замучившего душу программистов обычного Synchronize(тут метод класса) лучше Synchronize(begin
Form1.ListBox1.Items.Add(IntToStr(а тут можно использовать локальную переменную));
end;)
самая интересная фраза была такая
TestThread=class(TThread)
private
count,sum:integer;
NewThread.count:=StrToInt(ListBox2.Items[i]);
зачем в private загоняли?
FCount,FSum:integer; пишут в классе!(не правило, но хороший тон)
Пример многопочточности при HTTP запросах можно посмотреть здесь.
Хотелось бы, чтобы Вы описали многопоточность при работе с базами данных. Если конкретно, то интересует выполнение запроса ADOQuery в нескольких потоках и обработка их результатов.
Сергей,nmd,Дмитрий — эсли вы такие профи,то зачем читаете этот пост?
maxteam, все нормально. Я лично узнал из коментов больше, чем из статьи
+1005000 тебе тогда
1. Количество комментариев говорит о читаемости сайта.
2. Просьба, при написании такого типа материалов писать, а где это можно использовать на практике (желательно несколько вариантов, а то я далек от круга программистов, но люблю писать программы, и в даном случае не нахожу где бы использовать этот материал)