Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread: OnExecute Prozedur übergeben (https://www.delphipraxis.net/139888-thread-onexecute-prozedur-uebergeben.html)

kurtm1 7. Sep 2009 20:17


Thread: OnExecute Prozedur übergeben
 
Ich möchte einem Thread im Constructor eine Prozedur mitgeben, die dann vom Thread ausgeführt werden soll (OnExecute).

Wie kann dies realisiert werden?

Sir Rufo 7. Sep 2009 23:07

Re: Thread: OnExecute Prozedur übergeben
 
Schau Dir mal "TNotifyEvent"

cu

Oliver

Björn Ole 7. Sep 2009 23:40

Re: Thread: OnExecute Prozedur übergeben
 
Delphi-Quellcode:
type
  TAProcedure = procedure(i: integer);

  TMyThread = class(TThread)
  private
    FAProcedure: TAProcedure;
  protected
    constructor Create(CreateSuspended: boolean; AProcedure: TAProcedure);
    procedure Execute; override;
  end;

{...}

implementation

procedure MyProcedure(i: integer); // Kopf entspricht TAProcedure
begin
  {..}
end;

{ TMyThread }

constructor TMyThread.Create(CreateSuspended: boolean;
  AProcedure: TAProcedure);
begin
  inherited Create(CreateSuspended);
  FAProcedure := AProcedure;
end;

procedure TMyThread.Execute;
begin
  if Assigned(FAProcedure) then
    FAProcedure(1);
end;

{ TfrmMain }

procedure TfrmMain.BtnClick(Sender: TObject);
begin
  TMyThread.Create(false, @MyProcedure); // passende Prozedur übergeben
end;
Beachte aber, dass du eventuelle Zugriffe auf die VCL synchronisieren musst.

kurtm1 8. Sep 2009 20:52

Re: Thread: OnExecute Prozedur übergeben
 
Danke!

Wegen dem Synchronisieren:
Ich habe 2 Threads. Beide davon führen Aktionen aus bei denen Daten geändert werden und beide haben eine CallbackFunktion die in der VCL Progressbars setzen.
Eigentlich müsste es da genügen bei all diesen Prozeduren eine CriticalSection (Enter/Leave) einzufügen oder?

himitsu 8. Sep 2009 21:14

Re: Thread: OnExecute Prozedur übergeben
 
Das Problem sind nicht nur die Threads untereinander, denn es gibt noch den Hauptthread, in dessen Kontext die VCL (in diesem Fall die Form und die ProgressBars) ablaufen.

Delphi-Referenz durchsuchenSynchonize wäre da wichtig
und das würde auch die Threadzugriffe deiner beiden Threads auf die VCL gegenzeitig und gegen die VCL absichern

kurtm1 8. Sep 2009 21:20

Re: Thread: OnExecute Prozedur übergeben
 
Zitat:

Zitat von himitsu
Delphi-Referenz durchsuchenSynchonize wäre da wichtig

Ist Synchronize da besser/richtiger als wenn man mit CriticalSections arbeitet?

//edit noch eine Frage: und wenn ich eine Prozedur habe bei der ich zu wissen denke, dass darauf kein anderer Thread zugreifen kann, kann ich syncen eigentlich weglassen oder?

himitsu 8. Sep 2009 21:51

Re: Thread: OnExecute Prozedur übergeben
 
Synchronize blockiert wärenddessen den Hauptthread, denn auf deine ProgressBars wird auch von der VCL zugegriffen
(z.B. wenn diese die ProgressBar anzeigt/zeichnet)
und die VCL kennt deine CriticalSection nicht :zwinker:

Zitat:

und wenn ich eine Prozedur habe bei der ich zu wissen denke, dass darauf kein anderer Thread zugreifen kann, kann ich syncen eigentlich weglassen oder?
Wenn die Prozedur nichts verwendet, was andere Threads auch verwenden könnten,
bzw. nur threadsichere Dinge nutzen,
dann ja

PS: zu wissen sicher bist (es nur zu denken könnte Probleme bereiten)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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