Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datenaustausch zwischen 2 Threads bzw weitergabe von Daten. (https://www.delphipraxis.net/141285-datenaustausch-zwischen-2-threads-bzw-weitergabe-von-daten.html)

Jackie1983 6. Okt 2009 12:21


Datenaustausch zwischen 2 Threads bzw weitergabe von Daten.
 
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ß

Klaus01 6. Okt 2009 12:39

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
Zitat:

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

Jackie1983 6. Okt 2009 15:10

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
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

fajac 7. Okt 2009 07:09

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
Du könntest auch statt einer "normalen" TList TThreadList verwenden

Jackie1983 7. Okt 2009 12:45

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
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 :)

fajac 7. Okt 2009 13:08

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
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.

Jackie1983 7. Okt 2009 14:02

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
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.

Jackie1983 7. Okt 2009 14:21

Re: Datenaustausch zwischen 2 Threads bzw weitergabe von Dat
 
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ß


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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