AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenaustausch zwischen Threads (Sync)

Ein Thema von fuchsle · begonnen am 23. Sep 2011 · letzter Beitrag vom 30. Sep 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#11

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 11:26
[QUOTE=Sir Rufo;1126379]
Der Aufwand die beiden zu implementieren bleibt aber gleich, somit würde ich dem TMultiReadExclusiveWriteSynchronizer wohl doch den Vorzug geben
Seit ich weiß, wie langsam der TMREWS ist, mag ich ihn nicht mehr.
Oder anders gesagt: Wenn man keine rekursiven Aufrufe oder Elevation braucht, ist SlimReadWriteLock die viel schnellere Variante.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
fuchsle

Registriert seit: 22. Jul 2011
Ort: Heilbronn
35 Beiträge
 
Delphi XE3 Professional
 
#12

AW: Datenaustausch zwischen Threads (Sync)

  Alt 29. Sep 2011, 13:35
Hallo,

vielen Dank für eure Antworten, durch eine Erkältung komm ich erst jetzt wieder zur Sache.

Habe mich nun was die kritischen Bereiche betrifft versucht kundig zu machen.
Mit einem kritischen Bereich schütze ich Speicherbereiche.
Wenn ich nun eine Property damit schützen möchte, so muss ich die Methode für den kritischen Bereich in die Lese- und in die Schreibmethode der Property packen?

Delphi-Quellcode:
function ThreadValue.getNO2_10: Double;
begin
  try
    CSNO2_10.Acquire; // lock out other threads
    Result := FNO2_10;
  finally
    CSNO2_10.Release;
  end;
end;
Delphi-Quellcode:
procedure ThreadValue.setNO2_10(const Value: Double);
begin
  try
    CSNO2_10.Acquire; // lock out other threads
    FNO2_10 := Value;
  finally
    CSNO2_10.Release;
  end;
end;

So habe ich die Kritischen Bereiche definiert:

Delphi-Quellcode:
type
  ThreadValue = class(TThread)

  private
    { Private-Deklarationen }

    CSNO2_10: TCriticalSection;
    CSNO2_06: TCriticalSection;
    CSCompAir: TCriticalSection;
    CSCoolant: TCriticalSection;
Delphi-Quellcode:
{ ThreadGetValue }

procedure ThreadValue.Execute;
begin
  CSNO2_10 := TCriticalSection.Create;
  CSNO2_06 := TCriticalSection.Create;
  CSCompAir := TCriticalSection.Create;
  CSCoolant := TCriticalSection.Create;

Wenn ich nun mit meinem anderen Thread
Delphi-Quellcode:
type
  ThreadTCP = class(TThread)
  private
    { Private-Deklarationen }
    media: ThreadValue;
Versuche eine der Propertys aus zu lesen:
Self.FNO2_10 := media.NO2_10; so sehe ich, beim debuggen, dass die Methode
CSNO2_10.Acquire; // lock out other threads Immer einen Fehler verursacht und dadurch nie ein Wert gelesen werden kann.

Ich bin davon ausgegangen, dass mir eine lokale CriticalSection genügt, wenn diese in der "set" und "get" Methode eingebunden ist.

Vielen Dank für die weitere Hilfe runter vom Holzweg
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#13

AW: Datenaustausch zwischen Threads (Sync)

  Alt 30. Sep 2011, 05:55
Die allseits beliebte Frage lautet: Welcher Fehler tritt auf?

Desweiteren brauchst du bei simplen Typen (Integer, ...) nur die Schreibzugriffe schützen.
Nur bei Daten, die nicht in einer Aktion geschrieben werden können, sollte man andere lesende Threads aussperren, damit sie keine "halben" Daten lesen.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#14

AW: Datenaustausch zwischen Threads (Sync)

  Alt 30. Sep 2011, 06:59
Delphi-Quellcode:
function ThreadValue.getNO2_10: Double;
begin
  try
    CSNO2_10.Acquire; // lock out other threads
    Result := FNO2_10;
  finally
    CSNO2_10.Release;
  end;
end;
Das Acquire muss vor das try.
Delphi-Quellcode:
MyCriticalSection.Acquire;
Try
  DoSomethingWhichMightCrash();
Finally
  MyCriticalSection.Release
End;
Das Bild hängt schief.
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#15

AW: Datenaustausch zwischen Threads (Sync)

  Alt 30. Sep 2011, 08:24
Desweiteren brauchst du bei simplen Typen (Integer, ...) nur die Schreibzugriffe schützen.
Und das afaik auch nur, wenn man den Wert vor dem Ändern ausliest, oder?
Wenn es denn eine atomare Änderung ist, braucht die nicht geschützt werden...
  Mit Zitat antworten Zitat
fuchsle

Registriert seit: 22. Jul 2011
Ort: Heilbronn
35 Beiträge
 
Delphi XE3 Professional
 
#16

AW: Datenaustausch zwischen Threads (Sync)

  Alt 30. Sep 2011, 11:48
Desweiteren brauchst du bei simplen Typen (Integer, ...) nur die Schreibzugriffe schützen.
Und das afaik auch nur, wenn man den Wert vor dem Ändern ausliest, oder?
Wenn es denn eine atomare Änderung ist, braucht die nicht geschützt werden...
Wenn ich nur beim Schreiben schützen muss und nur ein Thread schreibt, so sollte ich mir jeglichen Schutz sparen können?
Geht es nicht darum zu verhindern, dass gelesen wird, wärend geschrieben wird?


Delphi-Quellcode:
function ThreadValue.getNO2_10: Double;
begin
  try
    CSNO2_10.Acquire; // lock out other threads
    Result := FNO2_10;
  finally
    CSNO2_10.Release;
  end;
end;
Das Acquire muss vor das try.
Delphi-Quellcode:
MyCriticalSection.Acquire;
Try
  DoSomethingWhichMightCrash();
Finally
  MyCriticalSection.Release
End;
Habe ich gemacht.
sobald nun über den anderen Thread versucht wird die Property aus zu lesen, wird in der Funktion beim versuch das Aquire zu setzen abgebrochen.

Die allseits beliebte Frage lautet: Welcher Fehler tritt auf?

Desweiteren brauchst du bei simplen Typen (Integer, ...) nur die Schreibzugriffe schützen.
Nur bei Daten, die nicht in einer Aktion geschrieben werden können, sollte man andere lesende Threads aussperren, damit sie keine "halben" Daten lesen.
Fehler: Zugriffsverletzung bei Adresse 005E4D 10 in Modul 'MediaController.exe'. Lesen von Adresse 00000064.

Geändert von fuchsle (30. Sep 2011 um 11:50 Uhr)
  Mit Zitat antworten Zitat
fuchsle

Registriert seit: 22. Jul 2011
Ort: Heilbronn
35 Beiträge
 
Delphi XE3 Professional
 
#17

AW: Datenaustausch zwischen Threads (Sync)

  Alt 30. Sep 2011, 12:08
Erstmal Herzlichen Dank Euch allen!!

Ich habe einiges dazu gelernt und bin wirklich dankbar.
Leider muss ich zugeben, dass es, nicht anderst wie erwartet an mir lag.
Nach einigem hin und her, habe ich vergessen eine Zeile wieder aus zu kommentieren,
leider das Create für den Thread auf den ich zugriefen will.

Schande über mein Haupt

Nach dem Auskommentieren und der Berücksichtigung der letzten Kommentare geht es nun.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:42 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