Einzelnen Beitrag anzeigen

IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Ein Versuch mit Omnithreadlibrary

  Alt 18. Sep 2020, 20:28
Delphi-Version: 5
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.
  Mit Zitat antworten Zitat