AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Synchronisieren von hauptthread und Teilthread
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronisieren von hauptthread und Teilthread

Offene Frage von "zorro08"
Ein Thema von zorro08 · begonnen am 8. Mär 2008 · letzter Beitrag vom 10. Mär 2008
 
zorro08

Registriert seit: 8. Mär 2008
4 Beiträge
 
#3

Re: Synchronisieren von hauptthread und Teilthread

  Alt 9. Mär 2008, 11:28
Danke für die extrem schnelle Antwort (5 min !, und dass um 24:00)
Ich habe die Anregungen ausgewertet und z.T. sofort getestet, aber sie lösen mein Problem wahrscheinlich nicht:

Zitat:
Menge der Daten, auf die sowohl Thread_A als auch der Hauptthread zugreifen, minimieren.
Aus bestimmten Gründen nur mit großem Aufwand möglich, aber der neue Mechanismus soll ja auch mit großen Datenmengen funktionieren


Zitat:
Critical sections nur im Hauptthread verwendenelphi-Quellcode: markieren
procedure TForm1.Timer1Timer(Sender: TObject);
begin
CS.Enter;
try
Label1.Caption := SomeDataToString(Thread_A.SomeData);
finally
CS.Leave;
end;
end;
Das scheint gerade das Problem zu sein: cs.enter / cs.leave klappen bei mir im Hauptthread eben insofern nicht, dass der Teil nach dem cs.enter immer ausgeführt wird. auch wenn sich thread_a innerhalb der cs befindet und darin die Daten gerade beschrieben werden.

Vielleicht ist es relevant, wie das beschreiben abläuft: Es wird im thread_a in der CS eine Sensorik angesprochen und deren Meßwerte u.a. in eine ASC-Datei geschrieben

Der haupthtread soll dann z.B. in der Timerroutine oder auf BtnClick diese ASC-Datei innerhalb einer CS wieder parsen und die Daten grafisch anzeigen. Da stört es natürlich, wenn thread_a das File gerade schreibt und der Hauptthread schon wieder darauf zugreifen will.

Dies hat komischerweise auch eine Weile geklappt. Neuerdings treten aber totale blockaden auf, die ich von früher nicht kannte.



Zitat:
Lieber dem Thread ein Ereignis geben, welches mit Synchronize() aufgerufen wird.
Delphi-Quellcode: zusammenfalten | markieren
1


Ich würde heute die ganze Sache anders anpacken, aber es handelt sich um alten Code, der noch ein bischen halten soll. Wenn cs.enter / cs.leave klappen würde, wäre ja alles gut.


Zitat:
Den Datenaustausch zwischen Hauptthread und Thread_A in eine Containerklasse auslagern, welche mit einem Singleton des TMultiReadExclusiveWriteSynchronizer den Zugriff regelt.

Habe ich getestet, verhält sich aber in Bezug auf Hautpthread / Thread wie cs.enter/cs.leave, geht also nicht: Ich kann im Hauptthread mehrmals MultiReadExclusiveWriteSynchronizer.BeginWrite aufrufen, wobei der Code dahinter immer abgearbeitet wird.

Ich versuche jetzt mal WaitForMultipleObjects als Warte - Mechanismus.

Für Hinweise bin ich weiterhin dankbar
Tom.
  Mit Zitat antworten Zitat
 


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:58 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