AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi einfaches Multithread Beispiel.
Tutorial durchsuchen
Ansicht
Themen-Optionen

Delphi einfaches Multithread Beispiel.

Ein Tutorial von gemy · begonnen am 12. Apr 2020 · letzter Beitrag vom 20. Apr 2020
Antwort Antwort
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.118 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Delphi einfaches Multithread Beispiel.

  Alt 13. Apr 2020, 20:07
habe mir nun https://www.youtube.com/watch?v=WOc89TF8l-8 angesehen.

Wie kann ich den thread löschen ?
Thread löschen ist immer blöd, so können andere den hier gegangenen Gedankengang nicht nachvollziehen. Verschieben wäre besser.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi einfaches Multithread Beispiel.

  Alt 14. Apr 2020, 07:41
Den Thread würde ich nicht löschen wollen. Ich empfinde ihn als gutes Tutorial, wie man hier gemeinsam zu der Lösung eines Problems kommen könnte, nebst sinnvoller Nebenschauplätze.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Delphi einfaches Multithread Beispiel.

  Alt 14. Apr 2020, 18:49
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Delphi einfaches Multithread Beispiel.

  Alt 14. Apr 2020, 20:46
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.


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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Delphi einfaches Multithread Beispiel.

  Alt 14. Apr 2020, 21:00
Link vergessen: http://michael-puff.de/Programmierung/Delphi/Tutorials/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi einfaches Multithread Beispiel.

  Alt 14. Apr 2020, 21:22
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.


if ((meinThread[i] <> nil ) and (meinThread[i].Terminated = false)) then meinThread[i].Terminate;
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
gemy

Registriert seit: 17. Feb 2019
34 Beiträge
 
#7

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
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Delphi einfaches Multithread Beispiel.

  Alt 18. Apr 2020, 15:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz