Thema: Delphi EVariantArrayLockedError

Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

EVariantArrayLockedError

  Alt 24. Aug 2004, 14:22
Hallo,

wir bekommen einen EVariantArrayLockedError in einem unserer Serverprogramme.

Weiß jemand was dieser Fehler bedeutet?
(oder wo ich dazu was nachlesen kann)

Im Google hab ich nix gefunden.

Der Fehler ist in der Unit Variants deklariert und wird in einem Thread geworfen.
Scheint also ein Sync Problem zu sein. Alle relevanten Anweisungen sind aber abgesichert.
Dieser Fehler tritt "leider" nur ca. ein bis zwei mal pro Quartal auf.

Die OH sagt:
EVariantArrayLockedError ist die Exception-Klasse für Fehler, die ausgelöst werden, weil ein Varianten-Array gesperrt oder fest ist.

Unit Variants

Beschreibung
EVariantArrayLockedError wird ausgelöst, wenn eine Operation mit einem Varianten-Array fehlschlägt, weil das Array gesperrt oder fest ist.


[edit]
Der Fehler tritt warscheinlich auf, wenn TClientDataSet.Refresh aufgerufen wird.

Diese Anweisung wird nicht über Synchronize() ausgeführt, sondern es wird ein TMultiReadExclusiveWriteSynchronizer verwendet.

Die liebe OH schreibt
TMultiReadExclusiveWriteSynchronizer dient dem Speicherschutz in einer Multithread-Anwendung.

Unit SysUtils

Beschreibung
Mit TMultiReadExclusiveWriteSynchronizer kann der Zugriff auf den Speicher in einer Multithread-Anwendung überwacht werden. Im Gegensatz zu einem kritischen Abschnitt, der alle anderen Threads am Lesen und Schreiben in den zugeordneten Speicher hindert, ermöglicht es TMultiReadExclusiveWriteSynchronizer, dass mehrere Threads gleichzeitig aus dem geschützten Speicher lesen können. Bei einem Schreibzugriff eines Thread stellt TMultiReadExclusiveWriteSynchronizer sicher, dass der Thread exklusiven Zugriff auf den Speicher hat.

TMultiReadExclusiveWriteSynchronizer kann die Ausführungsgeschwindigkeit von Anwendungen wesentlich verbessern, in denen Threads häufig Lesezugriffe auf ein Objekt oder eine Variable ausführen, aber nur gelegentlich in das Objekt bzw. die Variable schreiben.

Jeder Zugriff auf den geschützten Speicher muss in Aufrufe der Methoden BeginRead und EndRead bzw. BeginWrite und EndWrite eingeschlossen werden. Andernfalls kann es zu Konflikten zwischen den einzelnen Threads kommen.


Ich hoffe es kann mir jemand helfen
[/edit]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat