Hallo,Ich habe ein mein erstes Multithreading-TestProgramm geschrieben,& es ist vieeeeeeeeeeeel zu langsam.
Ich setzte den einmal die gleiche Rechenschleife in einen Thread ein & einmal in eine Procedore.Und in meinem Programm ist die Procedur 40x Schneller!
Mir ist schon klar, das die erschaffung der Threads und so, die Sache so verlangsamt.
Aber auch Multithreading kann ja heutzutage effizenter eingetzt werden!
Was mache ich also bei meinem Programm, wo an den Thread eine Array übergeben wird und dann auch die Array zurück!
Das Programm sieht wie folgt aus unit1=>Startet SteuerTread(Hier wird alles berechnet)=>Dieser verwaltet die NebenThreads1&2 die die Berechnungen durchführen
Dies ist die Procedure und Rechenschleife, das gliche wird in den Threads berechnet!
Delphi-Quellcode:
procedure Counten(Var Feld1:TIntegerDynArray);
Var x,y:Integer;
begin
for y:=0 to 13 do
for x:=0 to 156 do Feld1[x]:=Feld1[x]+1*2 div 2;
x:=SumInt(Feld1);
end;
Hier der Code von meiner Threadschleife:
Code:
procedure TGeldStatistikThread.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
Dec(Fi);
Case ThreadsRunning of
0:begin
ThreadsRunning:=5;
with TThread1.Create(Feld) do
OnTerminate := ThreadDone;
with TThread2.Create(Feld) do
OnTerminate := ThreadDone;
end;
3:begin
ThreadsRunning:=2;
with TThread1.Create(Feld) do
OnTerminate := ThreadDone;
with TThread2.Create(Feld) do
OnTerminate := ThreadDone;
//
Dec(Listenlaenge);
if Fi<0 Then
begin
Synchronize(Label2);
ThreadsRunning:=10;
end;
end;
end;
end;
NebenThread1 & 2 sind Identisch!
Code:
unit UnitNebenThread1;
interface
uses
Classes,Types,math;
type
TNebenThread1 = class(TThread)
private
Fe:TIntegerDynArray;
Liste:Integer;
{ Private declarations }
protected
procedure Execute; override;
procedure Counten2(Var Feld1:TIntegerDynArray); virtual; abstract;
public
constructor Create(Var Feld:TIntegerDynArray);
end;
{ TThreadCounter }
TThread1 = class(TNebenThread1)
protected
procedure Counten2(Var Feld1:TIntegerDynArray); override;
end;
implementation
uses unit1;
constructor TNebenThread1.Create(Var Feld:TIntegerDynArray);
begin
Fe:=Feld;
FreeOnTerminate := True;
inherited Create(False);
end;
procedure TNebenThread1.Execute;
begin
Counten2(Fe){ Thread-Code hier einfügen }
end;
procedure TThread1.Counten2(Var Feld1:TIntegerDynArray);
Var x,y:Integer;
begin
for y:=0 to 13 do
for x:=0 to 156 do Feld1[x]:=Feld1[x]+1*2 div 2;
x:=SumInt(Feld1);
end;
end.