AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datenaustausch zwischen 2 Threads bzw weitergabe von Daten.
Thema durchsuchen
Ansicht
Themen-Optionen

Datenaustausch zwischen 2 Threads bzw weitergabe von Daten.

Ein Thema von Jackie1983 · begonnen am 6. Okt 2009 · letzter Beitrag vom 7. Okt 2009
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Datenaustausch zwischen 2 Threads bzw weitergabe von Daten.

  Alt 6. Okt 2009, 13:21
Servus,

bin gerade dabei meine Client / Server Anwendung zu optimieren.
Zur Zeit läuft es so
Delphi-Quellcode:
Anwendung Anwendung
   | |
JobThread JobThread
   | |
 Server ---------- Client
möchte aber den JobThread weglassen. Also wenn ein Job vom Server kommt, wird dieser direkt
an die Anwendung weiter gegeben und der Server kann sofort wieder mit seine arbeit weiter machen.

Sonst war es so, Server hat neuen Job. Übergaben an Jobthread (Templiste). Jobthread übergabe von Templist an joblist. Von Jobthread übergabe an die Anwendung wenn die Anwendung fertig war, hat der Jobthread einen neuen job übergeben, in der Zeit wurde der Jobthread mit Jobs vom Server gefüttert.

Der Jobthread ist ein wenig umständlich programmiert, deswegen weg damit.

Möchte das gerne so machen:
Der Server bekommt einen Job übergibt den per Synchronize an die Anwendung, jetzt auch ein Thread.
Die Anwendung speichert den Auftrag in einer Templiste. Die Anwendung arbeitet in der Execute die Jobs
ab und ruft dazu die Methode auf wo die Jobs verabeitet werden bzw. ausgewertet.

Jetzt meine eigentliche frage.
Wenn die Anwendung gerade die Jobliste abarbeitet kann der Server ja nicht einen neuen hinzufügen.
Also muss ich doch mit zwei listen arbeiten, oder ist das kein Problem wenn die Methode von der Anwendung per Synchronize aufgerufen wird.

Problem übergaben der Daten ohne das irgend ein Thread hängen bleibt. Der Server thread soll die Daten übergeben und nicht weiter blockiert werden.
Weis leider nicht wie ich das besser beschreiben soll, hoffe man versteht was ich da will.
Gruß
  Mit Zitat antworten Zitat
Klaus01

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

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 6. Okt 2009, 13:39
Zitat von Jackie1983:
Jetzt meine eigentliche frage.
Wenn die Anwendung gerade die Jobliste abarbeitet kann der Server ja nicht einen neuen hinzufügen.
Also muss ich doch mit zwei listen arbeiten, oder ist das kein Problem wenn die Methode von der Anwendung per Synchronize aufgerufen wird.

Problem übergaben der Daten ohne das irgend ein Thread hängen bleibt. Der Server thread soll die Daten übergeben und nicht weiter blockiert werden.
Weis leider nicht wie ich das besser beschreiben soll, hoffe man versteht was ich da will.
Gruß
Auch Servus,

Eine Liste hast doch zwei Zugänge.

der Serverthread packt neue Aufträge an das Ende der Liste.
Die Anwendung holt sich, falls vorhanden, den Auftrag immer vom Listenplatz 0.
Die Anwendung sollte den Auftrag zur Bearbeitung kopieren und aus der Liste
löschen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 6. Okt 2009, 16:10
dachte mir nur das das zu Problemen kommt, wenn auf der einen Seite hinzugefügt wird
und auf der anderen wieder gelöscht.
Habe es umgebaut und werde es mal ein paar Tage testen und mal schauen wie weit ich gehen kann...
thx
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#4

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 7. Okt 2009, 08:09
Du könntest auch statt einer "normalen" TList TThreadList verwenden
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#5

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 7. Okt 2009, 13:45
Aber das Problem ist wenn ich per TThreadList die liste sperre und der job der gerade abgearbeitet wird dauert estwas länder, möchte in der Zeit der Server daten in die liste ablegen muss er warten. In der Zeit sendet ein Client ein ping da der Server aber noch wartet bis er die Daten rüber schaufeln kann kommt kein Pong un der Client trennt die Verbindung. Deswegen mache ich es mit zwei listen.

Die Jobliste wird bearbeitet und in der Templiste werden die jobs zwischen gespeichert. Ist die Joblist leer wird geschaut ob in der Templiste jobs sind wenn ja rüber schaufeln und liste wieder freigeben.

Solange wie die daten von der Templiste in die Jobliste geschoben werden, kann der Server keine neuen Daten in die liste legen. Das geht aber weil das "übertragen" der jobs aus die eine liste in die andere geht recht schnell.

Wenn aber jemand eine bessere Idee hat, bitte, bin offen für alles
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#6

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 7. Okt 2009, 14:08
Ein Lösungsansatz könnte sein, die Liste nur beim Hineinschreiben (sehr schnell) und beim Löschen aus ihr (auch sehr schnell) zu sperren. Während der Abarbeitung des Jobs kann die Sperrung schon wieder aufgehoben sein.
Ich kann mir kaum vorstellen, dass es dadurch zu nennenswerten Verzögerungen auf einer der beiden Seiten kommt.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#7

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 7. Okt 2009, 15:02
habe gerade mal ein log in den Client eingebaut.
Dort sehe ich das der Client kein Pong bekommt, er möchte also Daten senden, prüft mit einem Ping ob Verbindung besteht, wenn er kein Ping bekommt wird die Verbindung getrennt und versucht eine neue aufzubauen.

Wieso er kein Pong bekommt, hmmmmm.
Muss wohl dazu sagen das ich 25 Clients laufen habe die alle 10ms einen Befehl abschicken.
Ok kann auch sein das 10ms viel zu wenig ist aber ich denke ich will an die grenzen kommen.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#8

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat

  Alt 7. Okt 2009, 15:21
so wie es ausschaut habe ich mein "problem" gefunden.
Habe es aber nur gefunden, weis aber nicht wie ich es besser machen könnte.

Und zwar der Server sendet im 10 sekunden takt ein Ping und schaut bei der
nächsten kontrolle ob der client mit einem pong geantwortet hat.
Wenn nicht wird die Verbindung getrennt.
Wenn ok wird wieder ein Ping gesendet und so weiter.

Möchte der Client Daten senden, schickt er erst ein Ping um zu schauen ob die Verbindung noch besteht,
kommt ein pong in x ms zurück daten senden.

Jetzt habe ich mal den Alivetimer beendet und siehe da keine Probleme.
In den log der clients steht dannn (mit alivetimer)
Zitat:
[07.10.2009 15:16:07] OUT Ping <- ping senden
[07.10.2009 15:16:07] IN Alive <- alive bekommen
[07.10.2009 15:16:17] Err kein Pong!!! <- kein pong bekommen
Wenn ich aber keinen alive timer habe kann ich nicht feststellen ob der client noch da ist,
das muss ich aber wissen, z.b wird das kabel getrennt.

gruß
  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 08:12 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