![]() |
Threads (Beschreibung zu lang, siehe Text) ;)
Hallo, ich habe eine Klasse, die im Hauptthread der Anwendung erzeugt wird. Eine Funktion der Instanze dieser Klasse wird aus anderen Threads aufgerufen. Diese wiederum soll eine private Funktion der Klasse im Hauptthread aufrufen. Es ist wichtig, dass aus dem Aufruf aus dem anderen Thread wieder ein Aufruf im Hauptthread erfolgt. Ich habe das z.Zt. mit Windows Nachrichten gelöst. Läuft auch einwandfrei. Nun wollte ich fragen, ob es eine Möglichkeit der Lösung ohne SendMessage gibt? Ich finde das irgendwie "unelegant".
|
Re: Threads (Beschreibung zu lang, siehe Text) ;)
Hallo,
warum ist es wichtig den Aufruf der privaten Methode an den Hauptthread zu deligieren? Zu Synchronisationszwecken? Wenn ja, und wenn die private Methode deiner Klasse keine Aufrufparameter besitzt, könntest Du sie in einen Aufruf der statischen Synchronize-Methode der TThread-Klasse verpacken. In etwa so:
Delphi-Quellcode:
type
TMyClass = class(TObject) private procedure PrivateMethod; public procedure PublicMethod; end; ... procedure TMyClass.PublicMethod; begin //Private Methode synchronisiert aufrufen TThread.Synchronize(nil, PrivateMethod); end; Das ist allerdings nicht ganz ungefährlich. Wenn die öffentliche Methode der Klasse nicht aus einem Thread aufgerufen wird, kann es passieren, dass der Synchronize-Aufruf den Hauptthread lahmlegt. Gruß, Jens |
Re: Threads (Beschreibung zu lang, siehe Text) ;)
es gibt noch syncronize was aber so ziemlich aufs gleiche hinausläuft. bzw. warum sendest du messages? In manchen fällen reicht es auch einfach schon mit critical-sections zu arbeiten.
|
Re: Threads (Beschreibung zu lang, siehe Text) ;)
Zitat:
@jenbru Es ist sicher, dass es in einem Thread aufgerufen wird. Allerdings dürfte Synchronize da langsamer sein, arbeitet ja auch nicht viel anders. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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