DLL und Klasse in Multithread-Anwendungen

8

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"):

%Vor%

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?

    
AntonBazhal 30.07.2013, 14:59
quelle

1 Antwort

14

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.

    
Ondrej Kelle 30.07.2013, 15:36
quelle

Tags und Links