AGB  ·  Datenschutz  ·  Impressum  







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

Zugriff mehrerer Threads aufeinander

Ein Thema von milchbrötchen · begonnen am 13. Jun 2013 · letzter Beitrag vom 14. Jun 2013
Antwort Antwort
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#1

Zugriff mehrerer Threads aufeinander

  Alt 13. Jun 2013, 16:11
Hallo zusammen,

ich habe zwei verschiedene Threadklassen, von denen es in jeweils einem Array (array1, array2) beliebig viele geben kann. Nun soll jeder Thread in array1 jedem beliebigen Thread in array2 eine Aufgabe in die Liste schreiben können und umgekehrt auch jeder Thread in array2 jedem Thread in array1.

Code:
  taufgabensorte1 = class(tthread)
    private
      liste: tstringlist;
    ...

  taufgabensorte2 = class(tthread)
    private
      liste: tstringlist;
    ...

  talleaufgaben = class
    private
      array1: array of taufgabensorte1;
      array2: array of taufgabensorte2;
    ...
Ich komme aber irgendwie nicht drauf, wie man so etwas vernünftig (und professionell) umsetzen soll.

Vielen Dank für eure Ideen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Zugriff mehrerer Threads aufeinander

  Alt 13. Jun 2013, 16:16
Mir persönlich wären diese Abhängigkeiten zu gruselig - Ich kenne eigentlich immer nur das Konzept eines Dispatchers der zu erledigende Aufträge in Erfahrung bringt und daraufhin Worker-Threads erstellt und sie mit den entsprechenden Informationen für die Aufgabenerledigung füttert.

Die zum Speicherschutz bei mehreren Threads gängigen Objekte wie TCriticalSection oder TMultiReadExclusiveWriteSynchronizer kennst du?
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zugriff mehrerer Threads aufeinander

  Alt 13. Jun 2013, 16:18
Hallo,

wodurch unterscheiden sich Thread1 und Thread2?
Was bezweckst Du damit?

Wäre es nicht sinnvoller einen Threadpool zu haben der sich Aufgaben aus einer zentralen Liste holt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 07:05
...von denen es in jeweils einem Array (array1, array2) beliebig viele geben kann. ...
Sachma, was für eine CPU hast Du denn?

So kann man das imho am einfachsten lösen:

Delphi-Quellcode:
Procedure TMyThread.AddToList (const task : String);
Begin
  MyCriticalSection.Enter;
  Try
    MyStringList.Add(task);
  Finally
    MyCriticalSection.Leave;
  End
End;

Function TMyThread.GetNextTask : String;
Begin
  MyCriticalSection.Enter;
  Try
    If MyStringList.Count = 0 then
      Result := ''
    else begin
      Result := MyStringList[0];
      MyStringList.Delete(0);
    end
  Finally
    MyCriticalSection.Leave;
  End
End;
  Mit Zitat antworten Zitat
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#5

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 11:57
also um das mal näher zu beschreiben:

taufgabensorte1 ließt sekündlich Daten aus etwa 50 Geräten von Typ 1 aus (anders als mit Polling gehts leider nicht). Damit, wenns bei einem Gerät mal stockt, nicht auch alle anderen Leseoperationen stocken, habe ich mich für Threads entschieden (und nicht einfach nacheinander abfragen). Es können auch Werte in ein Gerät geschrieben werden.

taufgabensorte2 macht genau das gleiche mit etwa 10 Geräten von Typ 2 (völlig verschieden zu Typ 1, deswegen auch ganz anderes Threaddesign).

Wenn jetzt bestimmte Daten aus einem der Geräte von Typ 1 gelesen wurden, sollen diese in ein (oder auch mehrere) definierte(s) Gerät(e) von Typ 2 geschrieben werden. Also sollte dann in die Aufgabenliste des jeweiligen Threads geschrieben werden, was geschrieben werden soll, damit dieser dies im nächsten Durchlauf machen kann. Und das gleiche nochmal umgekehrt mit Daten von Geräten Typ 2 nach Typ 1.


P.S. Criticalsection ist mir bekannt.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 12:13
Etwas vielleicht vergleichbares hatte ich neulich auch. Erst wollte ich auch für jedes Gerät einen eigenen (relativ langsam laufenden) Watchdog-Thread aufsetzen.

Davon bin ich aber sehr schnell wieder abgesprungen, es wurde pro Anschluss ein einziger Thread, der alle auf dem Bus liegenden Geräte pollt. Bist du dir überhaupt sicher, dass du einfach parallel kommunizieren kannst wenn die Kommunikationsroutinen blockierend sind? Im Fall des seriellen Anschlusses beispielsweise blockieren andere Threads trotzdem wenn gerade ein Aufruf in einem anderen Thread hängt. Das nur als Hinweis.


Als zweiten Punkt möchtest du auf die eingelesenen Daten reagieren. Ich bleibe weiterhin dabei, dass sich die Threads für Gerätetyp auch kein Stück mit anderen (artfremden) Threads herumschlagen sollten. Du hast einen oder mehrere Threads, die sich um Informationsbeschaffung durch Polling kümmern. Die in Erfahrung gebrachten Werte werden in die entsprechenden Eigenschaften des Objekts geschrieben.
Das Objekt ließe sich weiterhin so einrichten, dass bei einem Aktualisieren der Werte Aktionen ausgeführt werden, beispielsweise eine Methode aufgerufen werden, die sich darum kümmert, welche neuen Informationen für die Geräte des Typs 2 sich daraus ergeben und geschrieben werden sollen. Diese Werte lassen sich in (wieder einen!) Thread für Typ 2 in eine Liste anhängen, was er in seinem nächsten Durchgang schreiben soll.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 12:22
taufgabensorte1 ließt sekündlich Daten aus etwa 50 Geräten von Typ 1 aus
...und sichert die Daten in eine Queue.
taufgabensorte2 macht genau das gleiche mit etwa 10 Geräten von Typ 2
Eine weitere Queue für die Empfangsrichtung.
Wenn jetzt bestimmte Daten aus einem der Geräte von Typ 1 gelesen wurden, sollen diese in ein (oder auch mehrere) definierte(s) Gerät(e) von Typ 2 geschrieben werden. Also sollte dann in die Aufgabenliste des jeweiligen Threads geschrieben werden
Da haben wir dann nochmal 2 weitere Queues für die Senderichtung.

Du brauchst also threadsichere Queues (first-in-first-out).
Hierzu könnte man die Klasse TThreadList verwenden.
Das Grundgerüst sieht so aus:
Delphi-Quellcode:
TThreadObjectQueue = class(TObject)
private
  FList : TThreadList;
public
  constructor Create;
  destructor Destroy;override;
  procedure Push(value:TObject);
  function Pop:TObject;
  function IsEmpty:Boolean;
  property Count:Integer read GetCount;
end;
Die Daten sind bei dir anscheinend nur Strings.
Ich würde empfehlen jeden Datensatz in einem Objekt zu speichern.

Die beiden Threads mit ihren Empfangs- und Sendequeue bilden jeweils einen Actor.
fork me on Github

Geändert von sx2008 (14. Jun 2013 um 12:30 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 12:27
..zu beachten ist dann noch wie zeitkritisch das ganze sein darf.
Also wenn Daten aus Typ1 ausgelesen werden, müssen die dann sofort in ein Typ2 Gerät geschrieben werden? Oder ist es relativ egal wann die Daten in den jeweilig anderen Typ geschrieben werden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#9

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 12:38
Ok das mit dem Auslagern der Aufgabenliste aus den Threads find ich gar nicht so schlecht
(das waren jetzt beispielhaft nur Stringlisten, das sind eigentlich noch ein paar mehr Daten und Datentypen, es geht ja aber ums Prinzip)

Code:
  taufgabensorte1 = class(tthread)
    private
      // liste: tstringlist;
    ...

  taufgabensorte2 = class(tthread)
    private
      // liste: tstringlist;
    ...

  talleaufgaben = class
    private
      liste1: tstringlist;
      liste2: tstringlist;
      array1: array of taufgabensorte1;
      array2: array of taufgabensorte2;
    ...
Wie greife ich denn im obigen Beispiel aus den Threads in den beiden Arrays auf die beiden stringlisten liste1 und liste2 zu?

(das ganze ist nicht so zeitkritisch)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Zugriff mehrerer Threads aufeinander

  Alt 14. Jun 2013, 13:35
..
Delphi-Quellcode:
tabelleAufgaben = class
     function getNextTask(TypeId):TaskToDo;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


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