AGB  ·  Datenschutz  ·  Impressum  







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

Strings thread-safe übergeben

Ein Thema von jus · begonnen am 28. Okt 2011 · letzter Beitrag vom 30. Okt 2011
 
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Strings thread-safe übergeben

  Alt 28. Okt 2011, 23:33
Strings, bzw. alles an nichtelementaren Typen, übergebe ich sehr gerne über Listen. Dem Thread also in deinem Fall einfach eine TSringList-Property mitgeben, an die der Thread selbst nur anhängt, aber nie selber etwas draus löscht bzw. ändert. Bei einem neuen Eintrag eine Windows-Message an alles was so zu benachrichtigen wäre verschicken, und dort dann lesen und löschen. (Bietet zudem die Option, eine LIFO oder FIFO Queue zu basteln.)
Grad bei Objekten mache ich es zudem ganz gerne so, dass ich zunächst eine lokale Arbeitsinstanz im Thread erstelle, diese komplett vorbereite, und dann das TList.Add() in einer CriticalSection erledige, so dass auch die letzte knall-gefährliche Ecke raus ist, und ich nicht auf die Implementierung von TList angewiesen bin threadsafe Add() zu haben. (Ich hab's aber auch ohne CS noch nie kaputtgehen sehen.)
Hat vor allem den Vorteil, dass ein zeitweise ausgebremster "Abholer" sobald wieder Luft ist alles verpasste in der richtigen Reihenfolge nachholen kann. Ob das wünschenswert ist, oder ob man sowas lieber skipped ist dann wieder vom konkreten Fall anhängig.

Bei der Übergabe zwischen zwei Threads übergehe ich dann noch ganz gern die Messages, und habe im Empfänger-Execute sowas stehen:
Delphi-Quellcode:
procedure TRecipientThread.Execute;
begin
  repeat
    if JobObjectList.Count > 0 then
    begin
      CurrentJobObject := JobObjectList[0];
      DoAllKindsOfStuffWith(CurrentJobObject);
      JobObjectList.Delete(0); // Das ist ne TObjectList mit OwnsObjects = true, daher kein .Free hier.
    end;
  until Terminated;
end;
Sowas ist im Thread der MainForm eher unpraktisch, daher dahin lieber die Messages.

Einzig unschöne daran ist, dass der Objektersteller nicht der Zerstörer ist, was mindestens einen entsprechenden Kommentar im Code bedarf. Aber ohne GC würden mir da wenige andere gute Wege einfallen, ausser die Gegenrichtung genau so zu gestalten: Nachricht an Thread: "Lösche bitte gleich deinen ersten Listeneintrag." - konsequenter, aber irgendwie auch nicht so wirklich viel schöner.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (28. Okt 2011 um 23:39 Uhr)
  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 11:38 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