AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Zugriff auf Objekte von Thread aus - Synchronize erforderl.?
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Objekte von Thread aus - Synchronize erforderl.?

Ein Thema von s.h.a.r.k · begonnen am 16. Sep 2008 · letzter Beitrag vom 17. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Zugriff auf Objekte von Thread aus - Synchronize erforderl.?

  Alt 16. Sep 2008, 10:51
hallo,

ich habe da mal eine prinzipielle frage bzgl thread: ich habe gelesen, dass man auf vcl-objekt nur mit synchronize zugreifen sollte, da es sonst komische effekt geben kann. das ist mir soweit auch verständlich.

nun ist es so, dass ich mir eigene klassen geschrieben haben, auf die ich per threads zugreife. diese klassen sind meist von tobject abgeleitet. muss ich, in so fern ich dann auf die methoden anderer objekte von einem thread aus zugreife, auch synchronize verwenden, oder macht das nichts?

als beispiel gebe ich mal eine log-klasse an und einen thread, der ständig die uptime der anwendung loggt.

mit freundlichen grüßen
der hai
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 11:05
Wenn du von mehreren Thread aus auf die Klasse zugreifst, dann solltest du die Zugriffe absichern. Also z.B. wenn der Hauptthread das Objekt erzeugt, und and den Thread weitergibt.

Wenn das Objekt ausschließlich von einem Thread verwendet wird, dann brauchst du das imho nicht absichern
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 11:06
Absichern musst du auch nur, wenn du Daten schreibst / veränderst.
Solange du auf Objekte von fremden Threads nur lesend zugreifst, dürftest du keine Probleme bekommen.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#4

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 11:30
Zitat von SubData:
Absichern musst du auch nur, wenn du Daten schreibst / veränderst.
Solange du auf Objekte von fremden Threads nur lesend zugreifst, dürftest du keine Probleme bekommen.
so würde ich das nicht sagen den was ist wenn der andere thread was rein schreibt während du gerade ließt?

Es ist eigentlich ganze einfach

Synchronize:
VCL-Thread <- Thread (Thread will auf VCL Object zugreifen)

Critical Sections:
VCL-Thread -> Thread (VCL will auf Thread zugreifen)
Thread <-> Thread


Wenn du eine Klasse erzeugst dann läuft diese immer in der instanz in dem du sie erstellst oder etwas aufrufst.
Also wenn du die klasse von der VCL erstellen lässt und auf einen Thread zugreifen willst dann musst du auch critical Sections verwenden.

Wenn du die klasse aber in einem thread erzeugst und in dieser klasse nur auf diesen thread zugreifst dann brauchst du nicht nichts spezielles.
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 11:32
Zitat von SubData:
Absichern musst du auch nur, wenn du Daten schreibst / veränderst.
Solange du auf Objekte von fremden Threads nur lesend zugreifst, dürftest du keine Probleme bekommen.
Stimmt das auch, wenn man auf eine Eigenschaft lesend zugreift, die einen Getter hat, der wiederum irgendetwas verändert?

Ergo: Aufpassen, Code anschauen. Oder auf Nummer sicher gehen.

Und denjenigen, der in einem Getter etwas verändert, teeren, federn und dann lynchen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 14:10
gut, soweit so gut. ich habe mich nun etwas in das thema eingelesen, nru verstehe ich glaub einiges noch nicht ganz so richtig...

annahme: ich habe den haupt-thread und einen anderen - dies ist ja auch zwei andere beliebige threads anwendbar. beim haupt-hread habe ich ein objekt, welches auf die datenbank zugreift (klasse tdatabase). im anderen thread habe ich eine referenz auf dieses objekt. wenn ich nun beim "normalen" thread eine sql-anweisung mache, dann sollte diese ja innerhalb von critical sections stehen, da es sonst zu problemen kommen kann, nur wie implementiere ich das?

könntet ihr mir im folgenden quellcode sagen, wo ich die critical section einfügen muss?!? ich kann das ja als lokale (als innerhalb der Methode machen) variable definieren, in der tdatabase-klasse oder in der tmainthread-klasse!? was ist die lösung?
Delphi-Quellcode:
TMainThread = class(TThread)
private
  FDatabase : TDatabase;
public
  procedure execSQL();
end;

procedure TMainThread.execSQL();
begin
  FDatabase.execSQL('SELECT...');
  row := FDatabase.getDataFromRow(0);
  { ... }
end;

TSecondThread = class(TThread)
private
  FDatabase : TDatabase;
public
  procedure execSQL();
end;

procedure TSecondThread.execSQL();
begin
  FDatabase.execSQL('SELECT...');
  row := FDatabase.getDataFromRow(0);
  { ... }
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 14:17
Du implementierst dies in eine eigene Ableitung von TDatabase oder in eine eigene Klasse (bspw. von TDatamodul), welche allein die Datenbank beinhaltet. Und dort baust du deine CS ein.

Alternativ würde ich einen eigenen Thread mit der Datanbank arbeiten lassen. Zumal ich mir nicht sicher bin, was die Komponenten im Hintergrund machen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 14:27
es ist klar, dass ich nicht alles bis auf das detail hin erklären kann, geht ja nur um das prinzip dabei, da ich es ja auch auf andere fälle anwenden muss. aber dann glaube ich das ganze verstanden zu haben.

die variable für die kritische sektion muss ich dann als klassenvariable (private) deklarieren, oder? und nicht lokal in die methode!?

bzw: was würde das für auswirkungen haben, wenn ich diese variable in der methode definiere? würde das dann überhaupt berücksichtig werden?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 15:10
Eine 'TCriticalSection' mit seinen Methoden 'Enter' und 'Leave' besagt, das der Code zwischen dem 'Enter' und 'Leave' nur von einem Thread ausgeführt werden kann. Wenn der andere Thread auch 'da rein' will, dann wartet dieser 2.Thread beim 'Enter', bis der 1.Thread das 'Leave' ausgeführt hat.

1 Raum mit 2 Türen (Enter und Leave).
"Enter" schließt hinter sich zu, sobald jemand durch diese Tür den Raum betritt.
Die Tür "Leave" schließt die Tür "Enter" wieder auf, sobald durch diese Tür der Raum verlassen wird.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Zugriff auf Objekte von Thread aus - Synchronize erforde

  Alt 16. Sep 2008, 15:27
Dabei ist aber wichtig, dass alle Threads bei jedem Zugriff auf die so geschützten Daten mit der Critical-Section arbeiten.

Ich würde das im Türenmodell eher so beschreiben: Man hat einen Raum mit einer Tür. Betritt ein Thread diesen Raum als CriticalSection, dann hängt er ein Schild an die Tür "Bitte nicht stören". Wenn ein anderer Thread auch in diesen Raum will (bzw. auf die Objekte darin zugreifen will), dann sollte er das auch über Enter/Leave CriticalSection tun, denn nur dann ist er so höflich und beachtet auch das Schild an der Tür. Ist ein Thread fertig, dann verlässt er den Raum und entfernt den Zettel.

Einfache Zugriffe auf Objektproperties (z.B. Integer-Werte) kann man auch per InterlockExchange Thread-sicher durchführen - das sollte auch schneller sein als jedes Mal in eine CriticalSection einzutreten.
The angels have the phone box.
  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 15:23 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