Delphi - gibt es irgendein äquivalent zu C# lock?
Schreibe ich eine multi-threaded-Anwendung in Delphi und brauche etwas zum Schutz der gemeinsamen Ressourcen.
In C# verwende ich die "lock" - Stichwort:
private someMethod() {
lock(mySharedObj) {
//...do something with mySharedObj
}
}
In Delphi konnte ich nicht finden, etwas ähnliches, ich fand nur TThread.Synchronisieren(someMethod) - Methode, die verhindert, dass mögliche Konflikte durch den Aufruf someMethod in Haupt-VCL-thread, aber es ist nicht genau, was ich tun soll....
Edit: ich verwende Delphi 6
- Zumindest kann man dem Aufruf der windows-API, die Kritische Abschnitte
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Un -) glücklicherweise sind Sie nicht sperren kann auf beliebige Objekte in Delphi 6 (obwohl Sie kann in den neueren Versionen 2009 und höher), so dass Sie brauchen, um einen separaten lock-Objekt, in der Regel ein Kritischer Abschnitt.
TCriticalSection (Hinweis: die Dokumentation ist von FreePascal, aber es gibt es in Delphi auch):
Beispiel-code:
Gibt es keine Entsprechung in Delphi 6. Ab Delphi 2009, können Sie die
System.TMonitor
Methoden zu greifen, sperren auf beliebige Objekte.(Sie müssen das "System" - Präfix, weil die TMonitor-Namen Konflikte mit der Art, in der Forms-unit. Die alternative ist die Verwendung der globalen
MonitorEnter
undMonitorExit
Funktionen.)Zwar nicht ganz so einfach wie c#, Folgendes könnte für Sie arbeiten.
In einer nussschale
Lock(mySharedObj)
, der internen Liste gesucht wird eine vorhandene Sperre. Ein neues Schloss wird angelegt, wenn keine vorhandene Sperre zu finden ist. Der neue thread wird gesperrt, wenn in einem anderen thread hat immer noch die Sperre.Unlock
ist notwendig, weil wir nicht sicher sein können, dass der Verweis auf die ILock-Instanz wird aus dem Geltungsbereich am Ende der Methode aufrufenLock
. (Wenn wir könnten, dieUnlock
entfernt werden konnte).Beachten Sie, dass in diesem design, eine TLock angelegt wird, für jede Objekt-Instanz, die Sie schützen möchten, ohne dass es freigegeben, bis die Anwendung beendet wird.
Dies konnte berücksichtigt werden, aber es würde bedeuten, Herumspielen mit _AddRef & _Release.
Wie gesagt, für kurze code, der nicht außerhalb des lokalen Bereichs und nicht erwerben jede andere Schlösser, die Sie verwenden können kritische Abschnitte über
SyncObjs.TCriticalSection
,für länger/komplizierter code, den Sie verwenden können
SyncObjs.TMutex
, die wartemöglichkeit (mit timeout), nicht anhalten, wenn der besitzende thread stirbt und geteilt werden können, namentlich mit einer anderen Prozesse.Mit Hilfe dieser Wrapper macht änderungen an der Synchronisation layer einfacher.
In allen Fällen, hüten Sie sich vor Drachen hier: meine Antwort auf Unterschied zwischen der WaitFor-Funktion für TMutex delphi und den Gegenwert in einer win32-API
Mit Klasse Helfern können Sie diese verwenden. Funktioniert nicht mit älteren Versionen, wenn. Aber ich würde raten, mit TMonitor nur in XE5. Da es oft viel langsamer als TRTLCriticalSection.
http://www.delphitools.info/2013/06/06/tmonitor-vs-trtlcriticalsection/