![]() |
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? |
Re: Thread: OnExecute Prozedur übergeben
Schau Dir mal "TNotifyEvent"
cu Oliver |
Re: Thread: OnExecute Prozedur übergeben
Delphi-Quellcode:
Beachte aber, dass du eventuelle Zugriffe auf die VCL synchronisieren musst.
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; |
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? |
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.
![]() und das würde auch die Threadzugriffe deiner beiden Threads auf die VCL gegenzeitig und gegen die VCL absichern |
Re: Thread: OnExecute Prozedur übergeben
Zitat:
//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? |
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:
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 02:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz