Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem: Bei Onterminate eine Variable mit übergeben (https://www.delphipraxis.net/86712-problem-bei-onterminate-eine-variable-mit-uebergeben.html)

CPO 18. Feb 2007 12:57


Problem: Bei Onterminate eine Variable mit übergeben
 
Auszug aus dem Delphi-Thread-Demo:

Delphi-Quellcode:
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;
Ich möchte der Procedure ThreadDone nun eine extra Variable (Numm) mit übergeben, welche unter private deklariert wird.

Delphi-Quellcode:
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;
Welches TObject muss da mit übergeben werden? - habe den Code nur in einer Unit.
Bei OnTerminate := ThreadDone; (Originalbeispiel) wird ja auch kein TObject mit übergeben.

inherited 18. Feb 2007 12:59

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"

CPO 18. Feb 2007 13:04

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?

marabu 18. Feb 2007 14:19

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

CPO 19. Feb 2007 09:29

Re: Problem: Bei Onterminate eine Variable mit übergeben
 
Vielen Dank für die Hinweise!

shmia 19. Feb 2007 09:55

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