Einzelnen Beitrag anzeigen

gemy

Registriert seit: 17. Feb 2019
31 Beiträge
 
#25

AW: Delphi einfaches Multithread Beispiel.

  Alt 18. Apr 2020, 15:15
Guten Abend zusammen. Habe alles nochmal überarbeitet.
Hier das Ergebniss. Erhöhe jetzt i mit atomic increment. Synchronize durch queue ersetzt. Habe von https://www.youtube.com/watch?v=WOc89TF8l-8&t=648s viel gelernt.


Kritik erwünscht und Verbesserungsvorschläge !


Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Comctrls, System.ImageList,
  Vcl.ImgList, Vcl.StdCtrls;

type
  TmyThread = class(TThread)
    private
      FMainThreadLog: TStrings;
    public
    constructor Create(Alog: Tstrings; DoOnTerminate: TnotifyEvent);
    procedure Execute; override;
    procedure OutputMessage(const Amessage: string);
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure HandleTerminate(Sender: Tobject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i:integer =0;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i :=0 to 5 do TmyThread.Create(ListBox1.Items, HandleTerminate);
end;





{ TmyThread }

constructor TmyThread.Create(Alog: Tstrings; DoOnTerminate: TnotifyEvent);
begin
inherited Create(false);
FMainThreadLog := Alog;
FreeOnTerminate := true;
OnTerminate := DoOnterminate;
end;

procedure TmyThread.Execute;
var z: integer;
begin
  TmyThread.Queue(nil, procedure
                        begin
                          FMainThreadLog.Add(IntToStr(ThreadID));
                        end
                        );
  for z := 0 to 49 do
  begin
    AtomicIncrement(i);
    sleep(random(50));
  end;
end;



procedure TForm1.HandleTerminate(Sender: Tobject);
begin
Caption := inttostr(i);
end;




procedure TmyThread.OutputMessage(const Amessage: string);
begin
if Assigned(FMainThreadLog) then
    FMainThreadLog.Add(Amessage);
end;


end.
  Mit Zitat antworten Zitat