AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TThread: wie sicher sind (private) Objekte im Thread?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von APP · begonnen am 28. Sep 2003 · letzter Beitrag vom 28. Sep 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

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

  Alt 28. Sep 2003, 08:48
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)
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?
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 28. Sep 2003, 11:49
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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 28. Sep 2003, 16:26
Hallo Sakura,
Du hast natürlich recht, ich habe den Code *falsch* herauskopiert und editiert.

Dahe bitte ich um noch eine Chanche

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...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 28. Sep 2003, 16:34
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 28. Sep 2003, 16:45
Moin Luckie,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 28. Sep 2003, 16:53
Ups, nicht gesehen.

Aber der try-Block macht es auf keinen Fall threadsave. Nicht umsonst hat MS die CriticalSections eingeführt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 28. Sep 2003, 16:53
Hallo Luckie,

also heute ist wohl etwas kompliziert mit mir!

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 )

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.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 28. Sep 2003, 17:00
Moin Armin,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 28. Sep 2003, 17:14
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?
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 28. Sep 2003, 17:27
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz