![]() |
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:
Ich übergebe eine Stringliste und verarbeite diese
MYThread := TMyTread.Create(aStringlist :TStringlist);
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:
Ist diese Variante sicher?
procedure TMyTread.Execute;
Var aStringlist :TStringlist; Begin TRY aStringlist := TStringlist.Create; ... INHERITED Create(TRUE); End; Und Allgemein: c)
Delphi-Quellcode:
Punkt c ist mein größtes Problem, einerseits schreibt Peter Below
procedure TMyTread.Execute;
Var aNichtVisuelleComponente :TNichtVisuelleComponente; Begin TRY aNichtVisuelleComponente := :TNichtVisuelleComponente.Create; ... INHERITED Create(TRUE); End; ![]() habe ich feststellen müssen, dass man ![]() kann mir jemand helfen? |
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:... |
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:
b)
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 :-)
Delphi-Quellcode:
c)
procedure TMyTread.Execute;
Var aStringlist :TStringlist; Begin TRY aStringlist := TStringlist.Create; ... End;
Delphi-Quellcode:
Bitte noch einmal,
procedure TMyTread.Execute;
Var aNichtVisuelleComponente :TNichtVisuelleComponente; Begin TRY aNichtVisuelleComponente := :TNichtVisuelleComponente.Create; ... End; 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... |
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.
|
Re: TThread: wie sicher sind (private) Objekte im Thread?
Moin Luckie,
Zitat:
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. |
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. |
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:
Wenn ich aStringlist, aNichtVisuelleComponente nur im Thread benutze ist das dann sicher?
procedure TMyTread.Execute;
Var aStringlist :TStringlist; aNichtVisuelleComponente :TNichtVisuelleComponente; Begin aStringlist := TStringlist.Create; aNichtVisuelleComponente := :TNichtVisuelleComponente.Create; ... End; @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. |
Re: TThread: wie sicher sind (private) Objekte im Thread?
Moin Armin,
Zitat:
a) nicht sicher b)+c) sicher, da hier die Objekte erst im Thread erzeugt werden, und nicht von woanders darauf zugegriffen wird. |
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? |
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. |
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