Delphi - Ist TClientDataset Thread sicher?

8
___ answer669501 ___

Mit einem Wort: Nein.

Alle VCL sollten als "Thread unsafe" betrachtet werden. Alle Aufrufe von visuellen Komponenten in einem TThread sollten in einem Synchronize-Ereignis ausgeführt werden.

Jede VCL / RTL-Klasse sollte vollständig innerhalb eines TThread erstellt und zerstört werden.

    
___ qstnhdr ___ Delphi - Ist TClientDataset Thread sicher? ___ tag123delphi ___ Delphi ist eine Sprache für die schnelle Entwicklung von nativen Windows-, macOS-, Linux-, iOS- und Android-Anwendungen mithilfe von Object Pascal. Der Name bezieht sich sowohl auf die Delphi-Sprache als auch auf deren Bibliotheken, Compiler und IDE, mit denen Delphi-Projekte bearbeitet und debuggt werden können. ___ answer669339 ___

Der Klonprozess sollte mit einem TCriticalSection behandelt werden, aber jedes TClientDataSet sollte in seinem eigenen Thread in Ordnung sein.

    
___ tag123tclientdataset ___ TClientDataset stellt eine speicherinterne Datenmenge dar, die eine datenbankunabhängige Datenmenge implementiert. Es ist in der DBClient.pas-Einheit definiert. ___ answer1112317 ___

Die kurze Antwort ist nein, ein ClientDataSet ist nicht Thread-sicher. Die umstrittenere Antwort ist, dass es davon abhängt, wie Sie es verwenden. Unabhängig davon, wie viele Clones des ClientDataSets Sie haben, können sie sicher aus mehreren Threads verwendet werden, solange Sie nur die Daten lesen. Dies gilt auch dann, wenn Sie unterschiedliche Bereiche, aktuelle Datensätze, Filter usw. festlegen.

Und obwohl Sie nicht danach gefragt haben, können Sie alle geklonten ClientDataSets, auch das ursprüngliche ClientDataSet, das geklont wurde, ohne Probleme freigeben.

Wenn es andererseits erforderlich ist, jemals einen Datensatz an einen der Klone zu senden oder die Daten neu zu laden, müssen Sie ein Synchronisationsobjekt verwenden. Wenn die Änderungen selten sind, ist die TMultiReadExclusiveWriteSynchronizer-Klasse ideal für diesen Zweck.

    
___
Charles Faiga 21.03.2009, 13:37
quelle

3 Antworten

15

Die kurze Antwort ist nein, ein ClientDataSet ist nicht Thread-sicher. Die umstrittenere Antwort ist, dass es davon abhängt, wie Sie es verwenden. Unabhängig davon, wie viele Clones des ClientDataSets Sie haben, können sie sicher aus mehreren Threads verwendet werden, solange Sie nur die Daten lesen. Dies gilt auch dann, wenn Sie unterschiedliche Bereiche, aktuelle Datensätze, Filter usw. festlegen.

Und obwohl Sie nicht danach gefragt haben, können Sie alle geklonten ClientDataSets, auch das ursprüngliche ClientDataSet, das geklont wurde, ohne Probleme freigeben.

Wenn es andererseits erforderlich ist, jemals einen Datensatz an einen der Klone zu senden oder die Daten neu zu laden, müssen Sie ein Synchronisationsobjekt verwenden. Wenn die Änderungen selten sind, ist die TMultiReadExclusiveWriteSynchronizer-Klasse ideal für diesen Zweck.

    
Cary Jensen 10.07.2009, 22:39
quelle
11

Mit einem Wort: Nein.

Alle VCL sollten als "Thread unsafe" betrachtet werden. Alle Aufrufe von visuellen Komponenten in einem TThread sollten in einem Synchronize-Ereignis ausgeführt werden.

Jede VCL / RTL-Klasse sollte vollständig innerhalb eines TThread erstellt und zerstört werden.

    
Nick Hodges 21.03.2009 15:52
quelle
4

Der Klonprozess sollte mit einem TCriticalSection behandelt werden, aber jedes TClientDataSet sollte in seinem eigenen Thread in Ordnung sein.

    
Tim Sullivan 21.03.2009 13:52
quelle

Tags und Links