Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi einfaches Multithread Beispiel. (https://www.delphipraxis.net/203981-delphi-einfaches-multithread-beispiel.html)

Luckie 14. Apr 2020 18:49

AW: Delphi einfaches Multithread Beispiel.
 
Ich meine, ich habe in meinem Threadtutorial zwei einfache Beispiele. Eins für die WinAPI und eins für die VCL. Nebenbei kann man damit auch etwas tiefer in die Materie einsteigen.

p80286 14. Apr 2020 20:46

AW: Delphi einfaches Multithread Beispiel.
 
Delphi-Quellcode:
procedure TmyThread.Syni;
begin
form1.Caption:= inttostr(i);
end;

procedure TmyThread.Synthreads;
var line: integer;
begin
form1.memo1.clear;
for line := Low(threads) to High(threads) do
form1.Memo1.Lines.Add(inttostr(threads[line]));
end;
Du setzt zwingend vorraus, das es ein Form1 gibt. Das ist mindestens leichtsinnig. Falls Du auf eine variable ausserhalb Deines Objektes zugreifen willst solltest Du diese auch offensichtlich übergeben.


Delphi-Quellcode:
if ((meinThread[i] <> nil ) and (meinThread[i].Terminated = false)) then meinThread[i].Terminate;
Du bist schon weiter oben darauf hingewiesen worden, daß dies eher suboptimal ist.

Gruß
K-H

Luckie 14. Apr 2020 21:00

AW: Delphi einfaches Multithread Beispiel.
 
Link vergessen: http://michael-puff.de/Programmierung/Delphi/Tutorials/

himitsu 14. Apr 2020 21:22

AW: Delphi einfaches Multithread Beispiel.
 
Jo, auch für die Wiederverwendbarkeit vorn Code ist es ungut hier "global" auf Form1 zuzugreifen,
sondern man könnte hier ein TMemo (Memo1) oder besser noch TStrings (Memo1.Lines) reingeben, denn dem kann man auch antere StringListen als Log reingeben.
Aber am Besten ist hier ein CallBack zuräck in die Form, wo die Form oder sonstwer dann mit dem LogText machen kann, was er will, ohne dass man an ein TMemo auf einer Form1 gebunden ist.


Zitat:

Zitat von p80286 (Beitrag 1462049)
Delphi-Quellcode:
if ((meinThread[i] <> nil ) and (meinThread[i].Terminated = false)) then meinThread[i].Terminate;

Delphi-Quellcode:
if ... = False then

Wer möchte dafür mit einem rosa Wattebausch gesteinigt werden?

Und ratet mal was Terminate macht?
Genau, es setzt nur Terminated auf True, also unnötig das nochmal zu prüfen, denn TRUEr als TRUE kann es nicht werden.

Delphi-Quellcode:
if Assigned(meinThread[i]) then
  meinThread[i].Terminate;
Und schon ist die Zeile extrem übersichtlich.

gemy 18. Apr 2020 15:15

AW: Delphi einfaches Multithread Beispiel.
 
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.

DieDolly 18. Apr 2020 15:18

AW: Delphi einfaches Multithread Beispiel.
 
Das neue Beispiel ist genau so schlimm wie das erste.
Du solltest dir nicht nur ein Video ansehen, sondern am besten in Fachbüchern nachschlagen und lernen, wie man das mit Threads richtig macht.
Ich würde an deiner Stelle aber noch viel weiter vorne anfangen - bei den Grundlagen. Das klingt hart und ich will dich nicht verletzen. Aber dieser Code hat nichts im Unterforum Tutorials zu suchen.

gemy 18. Apr 2020 15:29

AW: Delphi einfaches Multithread Beispiel.
 
Das ist von Coderage 2019 übernommen. Dann hat der wohl auch keine Ahnung.

DieDolly 18. Apr 2020 15:37

AW: Delphi einfaches Multithread Beispiel.
 
Übernehme keinen Code von irgendwoher - außer aus der DP hier ;)
Und ja da hast du recht. Das Beispiel was du übernommen hast ist wirklich gruselig.

gemy 18. Apr 2020 15:38

AW: Delphi einfaches Multithread Beispiel.
 
Das ist der Kanal von Embacadero Germany.

DieDolly 18. Apr 2020 15:44

AW: Delphi einfaches Multithread Beispiel.
 
Ich kann mir nicht vorstellen, dass Embarcaeero Germany solchen Code schreibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz