![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте. Не знаю в какой раздел написать, поэтому пишу в этот!
Хочу узнать больше о потоках в делфи, а именно как сделать не один поток к основному, а несколько? Читал статьи про потоки, но в каждой из них описано как создать один дополнительный поток к основному! Кому не тяжело объяснить, прошу показать на примере! Допустим нужно создать программу которая в 100 потоков будет считать до 1 миллиарда с шагом в 0.001! Как реализовать это в 100 потоков? Ну или пример вашей программы, которая что-то делает в многопоточном режиме! Последний раз редактировалось MoS, 19.04.2013 в 10:54. |
|
#2
|
||||
|
||||
|
На винграде целый талмуд был по потокам, поищи там.
|
|
#3
|
||||
|
||||
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyThread }
procedure TMyThread.Execute;
begin
// do it
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:=1 to 100 do TMyThread.Create(False);
end;
end. |
|
#4
|
||||
|
||||
|
Цитата:
Но есть еще вопрос, если в Execute есть: Код:
for k:=1 to 1000 do begin link:='http://www.-----.ru/page/'+IntToStr(i)+'/'; data:=Form1.IdHTTP1.Get(link); end; |
|
#5
|
||||
|
||||
|
В конструктор можно передать строку
Код:
for i := 0 to ... do
foo := TMyThread.Create('blabla'+inttostr(i)); |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
MoS (19.04.2013)
| ||
|
#6
|
||||
|
||||
|
и IdHTTP1 объяви в Execute
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
MoS (19.04.2013)
| ||
|
#7
|
||||
|
||||
|
Все пытаюсь разобраться с многопоточностью, вот пример кода, в 2 потока работает, только такое ощущение что в 1 поток (не основной) все работает намного быстрее!
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Potok = class(TThread)
private
h: Extended;
public
protected
procedure Execute; override;
procedure ShowResult;
end;
var
Form1: TForm1;
pot: Potok;
implementation
{$R *.dfm}
{ Potok }
procedure Potok.Execute;
begin
inherited;
h:=0;
while (h<>1000000000) do
begin
h:=h+0.001;
Synchronize(ShowResult);
end;
end;
procedure Potok.ShowResult;
begin
Form1.Label3.Caption:=FloatToStr(h);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
for i:=1 to 2 do
begin
pot:=Potok.Create(false);
pot.Priority:=tpNormal;
pot.FreeOnTerminate:=true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
for i:=1 to 2 do pot.Suspend;
end;
end. |
|
#8
|
||||
|
||||
|
Немного оффтоп:
Цитата:
Последний раз редактировалось lmikle, 20.04.2013 в 02:50. |
|
#9
|
||||
|
||||
|
Цитата:
|
|
#10
|
||||
|
||||
|
А в том, что ты 2 раза записываешь в одну переменную разные значения. Вопрос на засыпку: куда девается первое?
А потом ты пытаешься два раза один и тот же поток остановить. Вопрос: почему? |
|
#11
|
||||
|
||||
|
Цитата:
Приведите пожалуйста пример кода, вернее исправление моей программы! |
|
#12
|
||||
|
||||
|
Сделать массив из потоков, и присваивать в pot[i]. Соответственно, останавливать тоже pot[i]. А на будущее - отказаться от названий классов и переменных в транслитерации. А то будет
Код:
chbayta chetyrebayta := chbayta(_4bayta1); Последний раз редактировалось Bargest, 19.04.2013 в 23:58. |
|
#13
|
||||
|
||||
|
Цитата:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Potok = class(TThread)
private
h: Extended;
public
protected
procedure Execute; override;
procedure ShowResult;
end;
var
Form1: TForm1;
pot: array[1..10] of Potok;
implementation
{$R *.dfm}
{ Potok }
procedure Potok.Execute;
begin
inherited;
h:=0;
while (h<>1000000000) do
begin
h:=h+0.001;
Synchronize(ShowResult);
end;
end;
procedure Potok.ShowResult;
begin
Form1.Label3.Caption:=FloatToStr(h);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
for i:=1 to 2 do
begin
pot[i]:=Potok.Create(false);
pot[i].Priority:=tpNormal;
pot[i].FreeOnTerminate:=true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
for i:=1 to 2 do pot[i].Suspend;
end;
end.Цитата:
|
|
#14
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#15
|
||||
|
||||
|
Ну как дети, чес-слово. ТС поставь перед синхронайз паузу в 50-100 мс (миллисекунд) и будет тебе щастье (кста, наверное с большой буквы Щ)
ЗЫЖ видимо у тебя двухядерный проц ![]() |