Hi Leute
Ich, schwacher Hobbyprogrammierer versuche mal wieder etwas Neues zu lernen.
Könnt Ihr mir sagen, ob das so korrekt ist? Das ist nur ein Beispiel.
Im Endeffekt habe ich eine Liste mit sehr vielen Daten die sollen in eine Liste einsortiert werden.
Threaded weil die Daten unterwegs angepasst werden müssen und Serial habe ich es schon versucht, es dauert unheimlich lange.
Hier ist mein Code. Bitte um Mitleid, ich versuche es nur.
Ich möchte nur wissen ob der Aufbau so weit OK ist, oder muss ich noch mehr beachten.
Leider ist mein Englisch sehr, sehr schlecht und mich durchlesen ist sehr problematisch.
Ich habe vieles probiert, das scheint mir am besten zu funktionieren.
Im Endeffekt möchte ich ein ThreadPool abarbeiten. Leider kriege ich es mit dem Threadpool nicht wirklich hin also muss die Notlösung her.
Hier ist mein Code.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
OtlComm, OtlSync, OtlCommon, OtlTask, OtlCollections;
type
TForm1 =
class(TForm)
btnAsync: TButton;
Memo1: TMemo;
Button1: TButton;
procedure btnAsyncClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Liste : TStringList;
public
end;
var
Form1: TForm1;
implementation
uses
OtlTaskControl,
OtlParallel;
{$R *.dfm}
var
Abbruch : Boolean = False;
procedure TForm1.btnAsyncClick(Sender: TObject);
var
Index : Integer;
Indx : Integer;
Tasks : Word;
Fertig : Word;
Status :
string;
begin
Liste := TStringList.Create;
for Index := 1
to 10000000
do
begin
Liste.Add('
Ein Datensatz' +
Index.ToString);
end;
Abbruch := False;
Tasks := 3;
Fertig := 0;
{3 Parallele Tasks starten}
for Index := 1
to Tasks
do
begin
Parallel.Async(
procedure var Indx : Integer;
begin
{Executed in background Thread }
for Indx := 0
to (Liste.Count - 1)
div Tasks
do
begin
if Abbruch = True
then Break;
try
Sleep(Random(2000));
if Liste.Count > 0
then
begin
Status := Liste.Strings[0];
Liste.Delete(0);
Memo1.Lines.Add(Status);
end;
except
end;
end;
end,
Parallel.TaskConfig.OnTerminated(
procedure(
const Task: IOmniTaskControl)
begin
{Executed in Main Thread }
Inc(Fertig);
if Fertig = Tasks
then FreeAndNil(Liste);
end
)
);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Abbruch := True;
(*Ich muss die Möglichkeit haben es abzubrechen*)
end;
end.
Bitte um Kritik und Verbesserungsvorschläge.