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.
|
AW: Delphi einfaches Multithread Beispiel.
Delphi-Quellcode:
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.
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;
Delphi-Quellcode:
Du bist schon weiter oben darauf hingewiesen worden, daß dies eher suboptimal ist.
if ((meinThread[i] <> nil ) and (meinThread[i].Terminated = false)) then meinThread[i].Terminate;
Gruß K-H |
AW: Delphi einfaches Multithread Beispiel.
Link vergessen: http://michael-puff.de/Programmierung/Delphi/Tutorials/
|
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:
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:
Und schon ist die Zeile extrem übersichtlich.
if Assigned(meinThread[i]) then
meinThread[i].Terminate; |
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. |
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. |
AW: Delphi einfaches Multithread Beispiel.
Das ist von Coderage 2019 übernommen. Dann hat der wohl auch keine Ahnung.
|
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. |
AW: Delphi einfaches Multithread Beispiel.
Das ist der Kanal von Embacadero Germany.
|
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. |
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