Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TThread: wie sicher sind (private) Objekte im Thread? (https://www.delphipraxis.net/9506-tthread-wie-sicher-sind-private-objekte-im-thread.html)

APP 28. Sep 2003 07:48


TThread: wie sicher sind (private) Objekte im Thread?
 
Hallo,

ich habe ein Problem was die "Threadsicherheit" von Objekten betrifft.
Je mehr ich darüber lese, desto verwirrter werde ich, daher ein paar
konkrete Fragen:

In meinem speziellen Fall verwende ich immer nur einen Arbeitsthread.

a)
Delphi-Quellcode:
MYThread := TMyTread.Create(aStringlist :TStringlist);
Ich übergebe eine Stringliste und verarbeite diese
ausschließlich lesend im Thread, ist das sicher?
Im Delphi-Demobeispiel wird eine Paintbox verwendet, GrafikCopmos sind
aber von Haus aus Thread sicher, glaube ich.

b)
Delphi-Quellcode:
procedure TMyTread.Execute;
Var
aStringlist :TStringlist;
Begin
TRY
  aStringlist := TStringlist.Create;
...
  INHERITED Create(TRUE);
End;
Ist diese Variante sicher?

Und Allgemein:
c)
Delphi-Quellcode:
procedure TMyTread.Execute;
Var
  aNichtVisuelleComponente :TNichtVisuelleComponente;
Begin
  TRY
    aNichtVisuelleComponente := :TNichtVisuelleComponente.Create;
...
  INHERITED Create(TRUE);
End;
Punkt c ist mein größtes Problem, einerseits schreibt Peter Below
hier dass, das Erzeugen beliebiger Komponenten im Thread kein Problem ist, aber andererseits
habe ich feststellen müssen, dass man keine neuen Fenster im Thread erzeugen kann...

kann mir jemand helfen?

sakura 28. Sep 2003 10:49

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Zu a) Nur lesen ist solange sicher, wie niemand (andere Threads) sonst in der StringListe Änderungen durchführen.

Zu b und c) Beide Varianten können nicht gehen, da es zu Problemen kommt, wenn man in einer Methode der Klasse den Konstruktor des eigenen Objektes (inherited Create...) aufruft.

...:cat:...

APP 28. Sep 2003 15:26

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Hallo Sakura,
Du hast natürlich recht, ich habe den Code *falsch* herauskopiert und editiert. :wall:

Dahe bitte ich um noch eine Chanche :mrgreen:

a)

Delphi-Quellcode:
MyThread = class(TThread)
  private
    FMyStringlist :TStringlist;
...


MYThread := TMyTread.Create(aStringlist :TStringlist);
Begin
  FMyStringlist := aStringlist; // Ich arbeite nur mit FMyStringlist innerhalb des Threads,
                                // sollte eigentlich sicher sein, oder?
  ...
  inherited Create(False);     // hier ist mein inherited :-)
b)
Delphi-Quellcode:
procedure TMyTread.Execute;
Var
aStringlist :TStringlist;
Begin
TRY
  aStringlist := TStringlist.Create;
...
End;
c)
Delphi-Quellcode:
procedure TMyTread.Execute;
Var
  aNichtVisuelleComponente :TNichtVisuelleComponente;
Begin
  TRY
    aNichtVisuelleComponente := :TNichtVisuelleComponente.Create;
...
End;
Bitte noch einmal,

a) sollte Threadsave sein, oder?
b) ThreadSave?
c) ThreadSave?

Konretes Beispiel: Ich habe eine Stringliste mit verschiedenen Pfaden, die ich per TAbZipper von TurboPower Abbrevia
im Thread zippen möchte. Da ich ja auf das Ereignis "fertig gezippt" warten muß, möchte ich alles im Thread erledigen.

Ich weiß nicht genau ob Abbrevia threatsicher ist...

Luckie 28. Sep 2003 15:34

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Ein try-Block macht nichts threadsave, erfängt nur die Exceptions ab. Wenn dann die Interlocked-Funktionen oder CriticalSections. Aber wazu? Auf die Membervariable des Thread-Objektes hat doch niemand Zugriff außer der Thread selber.

Christian Seehase 28. Sep 2003 15:45

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Moin Luckie,

Zitat:

Zitat von Luckie
Auf die Membervariable des Thread-Objektes hat doch niemand Zugriff außer der Thread selber.

nur in Beispiel a enthält diese Variablen einen Pointer auf eine Objekt aus einem anderen Thread.
Deshalb würde ich a als nur bedingt threadsicher ansehen.
Sicherer wäre es die Liste innerhalb des Threads in eine interne Liste umzuschaufeln, und diese dann zu verarbeiten.

Luckie 28. Sep 2003 15:53

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Ups, nicht gesehen. :oops:

Aber der try-Block macht es auf keinen Fall threadsave. Nicht umsonst hat MS die CriticalSections eingeführt.

APP 28. Sep 2003 15:53

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Hallo Luckie,

also heute ist wohl etwas kompliziert mit mir! :gruebel:

Ich wollte halt einen besonders "sauberen" Code schreiben,
und verwirre damit alle Leute, da er total fehlerhaft ist.
(War wohl eine zu lange Nacht gestern :cheers: :pale: :cheers:)

3. Chanche

a) wie oben. Ist das sicher, da FMyStringlist eine "Membervariable" ist?


b) + c)
Delphi-Quellcode:
procedure TMyTread.Execute;
Var
  aStringlist :TStringlist;
  aNichtVisuelleComponente :TNichtVisuelleComponente;
Begin
  aStringlist := TStringlist.Create;
  aNichtVisuelleComponente := :TNichtVisuelleComponente.Create;
...
End;
Wenn ich aStringlist, aNichtVisuelleComponente nur im Thread benutze ist das dann sicher?

@Christian Seehase
Ich dachte mir, FMyStringlist ist eine interne Variable, die ich nur im Thread nutze,
aStringlist ist ein Parameter der im VCL-Hauptthread übergeben wird.

Christian Seehase 28. Sep 2003 16:00

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Moin Armin,

Zitat:

Zitat von APP
Ich dachte mir, FMyStringlist ist eine interne Variable, die ich nur im Thread nutze,

der übergibst Du aber einen Pointer auf ein Objekt, dass sich in einem anderen Thread befindet, und somit ist das potentiell nicht threadsicher.
a) nicht sicher
b)+c) sicher, da hier die Objekte erst im Thread erzeugt werden, und nicht von woanders darauf zugegriffen wird.

APP 28. Sep 2003 16:14

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Hallo Christian,

jetzt verstehe ich!

Zu c), da mach ich mir halt Sorgen, da die Komponente (TAbZipper von TurboPower Abbrevia)
möglicherweise VCL-Funktionen benutzten könnte, oder?

Wenn nun in den USES Aufrufen nirgendwo VCL Sourcen vorkommen, könnte sie dan Threadsicher sein?

Christian Seehase 28. Sep 2003 16:27

Re: TThread: wie sicher sind (private) Objekte im Thread?
 
Moin Armin,

bei einer nicht visuellen Kompo halte ich es aber für recht unwahrscheinlich, dass die nicht thread sicher ist.
Zur Not kannst Du sie ja immer noch über Synchronize verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz