AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Thread: OnExecute Prozedur übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Thread: OnExecute Prozedur übergeben

Ein Thema von kurtm1 · begonnen am 7. Sep 2009 · letzter Beitrag vom 8. Sep 2009
Antwort Antwort
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#1

Thread: OnExecute Prozedur übergeben

  Alt 7. Sep 2009, 20:17
Ich möchte einem Thread im Constructor eine Prozedur mitgeben, die dann vom Thread ausgeführt werden soll (OnExecute).

Wie kann dies realisiert werden?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: Thread: OnExecute Prozedur übergeben

  Alt 7. Sep 2009, 23:07
Schau Dir mal "TNotifyEvent"

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 10. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#3

Re: Thread: OnExecute Prozedur übergeben

  Alt 7. Sep 2009, 23:40
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.
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#4

Re: Thread: OnExecute Prozedur übergeben

  Alt 8. Sep 2009, 20:52
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Thread: OnExecute Prozedur übergeben

  Alt 8. Sep 2009, 21:14
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#6

Re: Thread: OnExecute Prozedur übergeben

  Alt 8. Sep 2009, 21:20
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Thread: OnExecute Prozedur übergeben

  Alt 8. Sep 2009, 21:51
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

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 23:30 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