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 1 von 2  1 2      
fuchsle

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

Datenaustausch zwischen Threads (Sync)

  Alt 23. Sep 2011, 15:45
Hallo zusammen,

ich habe die Suchfunktion nun schon länger geplagt und schon einige Beispiele durch. Leider hat es mir noch immer nicht auf die Sprünge geholfen.

Bei ist ein Thread zuständig Daten zu sammel, der Andere soll Diese per TCP/IP bereitstellen.
Beide Threads arbeiten wie erwartet, aber sobald ich die gesammelten Daten (4 double) in die property des anderen thread schreiben möchte bekomm ich eine Fehlermeldung:

Zugriffsverletzung ... Schreiben von Adresse ...

Delphi-Quellcode:

      Synchronize(ExtUpdate);

// ...

procedure ThreadValue.ExtUpdate;
begin
  TCPIP.TCP_NO2_10 := NO2_10;
  TCPIP.TCP_NO2_06 := NO2_06;
  TCPIP.TCP_CompAir := CompAir;
  TCPIP.TCP_Coolant := Coolant;
end;
Bisher bin ich davon ausgegangen, dass ich mit einem Synchronize() es schaffe auf den anderen Thread zu zu greifen.


Ich bin über eure Hilfe dankbar,
leider noch Anfänger, was Delphi betrifft und OOP, daher evtl. auch auf dem Holzweg
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Datenaustausch zwischen Threads (Sync)

  Alt 23. Sep 2011, 16:13
Schau Dir mal TMultiReadExclusiveWriteSynchronizer an
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

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

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 07:36
Schau Dir mal TMultiReadExclusiveWriteSynchronizer an
Als Alternative gibts dann nach die TCriticalSection aus der Unit SyncObjs
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.008 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 10:03
Schau Dir mal TMultiReadExclusiveWriteSynchronizer an
Als Alternative gibts dann nach die TCriticalSection aus der Unit SyncObjs

Und dann ist da noch System.TMonitor (für das eigens TObject erweitert wurde).
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 10:05
Schau Dir mal TMultiReadExclusiveWriteSynchronizer an
Als Alternative gibts dann nach die TCriticalSection aus der Unit SyncObjs
Eine TCriticalSection sperrt aber immer komplett beim Lesen und Schreiben (Enter..Leave), der TMultiReadExclusiveWriteSynchronizer sperrt aber immer nur bei Schreibzugriffen (BeginWrite..EndWrite).
Somit sind die schon mal A sehr verwandt und B in einer MultiThread-Umgebung besser.

Allerdings in dieser vom TE aufgezeigten Konstellation nicht notwendig (2 Threads schreibend, 1 Thread lesend)
Der Aufwand die beiden zu implementieren bleibt aber gleich, somit würde ich dem TMultiReadExclusiveWriteSynchronizer wohl doch den Vorzug geben
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 10:20
Eine TCriticalSection sperrt aber immer komplett beim Lesen und Schreiben (Enter..Leave), der TMultiReadExclusiveWriteSynchronizer sperrt aber immer nur bei Schreibzugriffen (BeginWrite..EndWrite).
Somit sind die schon mal A sehr verwandt und B in einer MultiThread-Umgebung besser.
Wenn sich aber beim Lesen etwas verändert, dann zählt das als Schreibzugriff und muß ebenfalls gesperrt werden.
z.B. das Auslesen eines Streams, wo sich ja der Positionszeiger ändert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

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

AW: Datenaustausch zwischen Threads (Sync)

  Alt 24. Sep 2011, 12: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
 
#8

AW: Datenaustausch zwischen Threads (Sync)

  Alt 29. Sep 2011, 14: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 BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9

AW: Datenaustausch zwischen Threads (Sync)

  Alt 23. Sep 2011, 19:34
Bisher bin ich davon ausgegangen, dass ich mit einem Synchronize() es schaffe auf den anderen Thread zu zu greifen.
Synchronize() bringt dich in den Kontext des Hauptthreads, dein anderer Thread ist davon nicht betroffen.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Datenaustausch zwischen Threads (Sync)

  Alt 23. Sep 2011, 19:41
Es gibt von Synchronize aber auch noch ein paar überladene Methoden, wo man den gewünschten Thread-Kontext angeben kann.

Ansonsten mit Critical Sections arbeiten, wenn die Daten einfach nur abgeliefert werden sollen.

Und anstatt Synchronize kann man es auch mal mit Queue versuchen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 06:40 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 by Thomas Breitkreuz