Problem: Bei Onterminate eine Variable mit übergeben
Auszug aus dem Delphi-Thread-Demo:
Delphi-Quellcode:
Ich möchte der Procedure ThreadDone nun eine extra Variable (Numm) mit übergeben, welche unter private deklariert wird.
type
TThreadSortForm = class(TForm) StartBtn: TButton; BubbleSortBox: TPaintBox; SelectionSortBox: TPaintBox; QuickSortBox: TPaintBox; Label1: TLabel; Bevel1: TBevel; Bevel2: TBevel; Bevel3: TBevel; Label2: TLabel; Label3: TLabel; procedure BubbleSortBoxPaint(Sender: TObject); procedure SelectionSortBoxPaint(Sender: TObject); procedure QuickSortBoxPaint(Sender: TObject); procedure FormCreate(Sender: TObject); procedure StartBtnClick(Sender: TObject); private ThreadsRunning: Integer; procedure RandomizeArrays; procedure ThreadDone(Sender: TObject); public procedure PaintArray(Box: TPaintBox; const A: array of Integer); end; ... procedure TThreadSortForm.StartBtnClick(Sender: TObject); begin RandomizeArrays; ThreadsRunning := 3; with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone; with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do OnTerminate := ThreadDone; with TQuickSort.Create(QuickSortBox, QuickSortArray) do OnTerminate := ThreadDone; StartBtn.Enabled := False; end; procedure TThreadSortForm.ThreadDone(Sender: TObject); begin Dec(ThreadsRunning); if ThreadsRunning = 0 then begin StartBtn.Enabled := True; ArraysRandom := False; end; end;
Delphi-Quellcode:
Welches TObject muss da mit übergeben werden? - habe den Code nur in einer Unit.
type
TThreadSortForm = class(TForm) ... private ThreadsRunning: Integer; Numm:byte; procedure RandomizeArrays; procedure ThreadDone(Sender: TObject; Numm:byte); public procedure PaintArray(Box: TPaintBox; const A: array of Integer); end; ... procedure TThreadSortForm.StartBtnClick(Sender: TObject); begin RandomizeArrays; ThreadsRunning := 3; with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone(??,10); with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do OnTerminate := ThreadDone(??,10); with TQuickSort.Create(QuickSortBox, QuickSortArray) do OnTerminate := ThreadDone(??,10); StartBtn.Enabled := False; end; procedure ThreadDone(Sender: TObject; Numm:byte); begin Dec(ThreadsRunning); if ThreadsRunning = 0 then begin StartBtn.Enabled := True; ArraysRandom := False; end; If Numm=10 then ..... end; Bei OnTerminate := ThreadDone; (Originalbeispiel) wird ja auch kein TObject mit übergeben. |
Re: Problem: Bei Onterminate eine Variable mit übergeben
Ist in diesem Falle, da die Funktion ja nicht mit der Sender-variable macht, ziemlich egal. Im Zweifelsfall einfach "self"
|
Re: Problem: Bei Onterminate eine Variable mit übergeben
Hab da doch Probleme mit der Syntax:
OnTerminate := ThreadDone(self,10); Oder muss das [self] irgendwie in Klammern? |
Re: Problem: Bei Onterminate eine Variable mit übergeben
Hallo,
der Routine ThreadDone() einen zusätzlichen Parameter mitgeben zu wollen ist keine gute Idee. Die property OnTerminate hat nunmal einen vordefinierten Typ - TNotifyEvent - und der sieht keinen weiteren Parameter vor. Wäre der Thread eine visuelle Komponente, dann würdest du den event handler per Doppelklick im Object Inspector anlegen und er hätte genau die richtige Signatur - kein Vertun. Grüße vom marabu |
Re: Problem: Bei Onterminate eine Variable mit übergeben
Vielen Dank für die Hinweise!
|
Re: Problem: Bei Onterminate eine Variable mit übergeben
Die TThread-Klasse hat das Property ReturnValue. ReturnValue dient dazu, dass der Thread dem Hauptthread eine Information zurückgeben kann. (z.B. 0=alles OK 1=vorzeitig abgebrochen 2=Fehler)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 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