Ich habe eine Klasse in meiner DLL. Und diese DLL stellt eine "Schnittstelle" zur Verfügung, um Objekte dieser Klasse zu erstellen und ihre Methoden aufzurufen.
Klassencode (vereinfacht):
%Vor%DLL-Code
%Vor% Wenn ich versuche, diese Bibliothek aus 1 Thread zu verwenden - alles ist in Ordnung. Die Probleme beginnen, wenn ich viele Threads erzeuge, die die Funktion AddToLog
mit zufälligen Perioden aufrufen (jeder Thread hat sein eigenes Objekt der Klasse). In einiger Zeit fange ich Access Violation
oder Invalid pointer operation
.
Ich habe einige Nachforschungen angestellt und darauf hingewiesen, dass alles in Ordnung ist, wenn die Variable Temp2
WideString
type hat. Eine andere Lösung ist Mutex in den Bibliothekscode zu verschieben (es ist nur ein "Forschungscode"):
Die zweite Lösung ist schlecht für mich, weil jedes Objekt seinen eigenen Mutex hat (Idee ist, dass wenn zwei Objekte mit einer Datei arbeiten müssen, sie den gleichen Mutex haben, um aufeinander zu warten; wenn zwei Objekte mit verschiedenen Dateien arbeiten müssen verschiedene Mutexe haben und parallel arbeiten).
Ich versuche dieses Problem für zwei Tage zu lösen, aber ich verstehe nicht, was schief läuft. Wie kann ein String-Cast ein solches Problem verursachen?
Geben Sie die folgende Zeile ein:
%Vor%als erste Zeile im Hauptcodeblock Ihres DLL-Projekts. Dadurch wird der Speichermanager angewiesen, in einen threadsicheren Modus zu wechseln.
Dies würde eine Verhaltensdifferenz zwischen AnsiString
und WideString
erklären, da AnsiString
vom Delphi-Speichermanager zugewiesen wird und WideString
auf dem COM-Heapspeicher zugewiesen wird. Wenn IsMultiThread
False
ist, ist der Delphi-Speichermanager nicht Thread-sicher, aber der COM-Heap ist immer Thread-sicher.
Tags und Links class dll multithreading delphi