![]() |
AW: Konzept: Netzwerkprotokoll
Wenn das Protokoll erstmal feststeht, kann man sicher noch beliebig optimieren.
Denkbar fände ich zum Beispiel eine mehrstufige Abbildung der IDs. Damit sparst du auch im angesprochenen Extremfall noch Speicher :) Interessant könnte auch das Minimieren von Kopieroperationen (ganz abgesehen von Speicherallokation/-freigabe) innerhalb der Implementation sein (=> Allgemein, habe mir die Implementation noch nicht angeguckt). |
AW: Konzept: Netzwerkprotokoll
Zu deinem Thread.Execute:
IMHO machst du da zuviel Gedöns in dem Thread, was da nicht hingehört. Der IOHandler hat alle Informationen, wie was wo gesendet werden soll, allerdings nicht direkt wann, das kommt ja im Thread. Also würde ich den Thread auf seine wesentlichen Sachen reduzieren und dann sieht das wie folgt aus
Delphi-Quellcode:
Allerdings würde ich den IOHandler nicht an den Thread hängen, sondern den Thread an den IOHandler. Dann gibt es auch kein Gerangel wer den Thread beenden kann (wird ja auch über das FWaitEvent gesteuert).
procedure TdxIDTPSendThread.Execute;
begin while not Terminated do begin WaitForSingleObject( FWaitEvent, INFINITE ); if not Terminated then FIOHandler.SendDataPacket; end; end; Es könnte passieren, dass trotz Terminate der Thread nicht aufhört, weil direkt nach dem Terminate der Thread selber das FWaitEvent zurücksetzt ;) |
AW: Konzept: Netzwerkprotokoll
Schonmal vielen Dank für eure Antworten!
Zitat:
Zitat:
Wer sich die aktuelle Implementierung mal als Ganzes anschauen möchte: ![]() |
AW: Konzept: Netzwerkprotokoll
Zitat:
Das doofe daran ist, wenn man es gar nicht gebrauchen kann, dann schlägt das zu (Murphy) ;) Hier mal mein Vorschlag für den Händler:
Delphi-Quellcode:
TIOHandler = class
private FSendQueue, FWaitQueue : TQueue<TdxIDTPOTransfer>; ... protected ... procedure SendDataPacket; ... end; TIOHandler.SendDataPacket; var Transfer : TdxIDTPOTransfer; begin { CRITICAL-SECTION START } // Aus der Queue entnehmen Transfer := FSendQueue.Dequeue; { CRITICAL-SECTION ENDE } // Senden Transfer.SendNextPacketData; // Diesen Teil würde ich auch in eine eigene Methode packen, da diese auch aufgerufen werden sollte, // wenn eine neue Transfer-Instanz hinzukommt { CRITICAL-SECTION START } // Mal schauen, was mit der Instanz weiter passieren soll if ( Transfer.TransferState = tsActive {?} ) and ( Transfer.Priority or ( FSendQueue.Count < OutgoingTransferCountLimit ) ) then FSendQueue.Enqueue( Transfer ) else if ( Transfer.TransferState <> tsFinished ) then FWaitQueue.Enqueue( Transfer ) else Transfer.Free; while ( FSendQueue.Count < OutgoingTransferCountLimit ) and ( FWaitQueue.Count > 0 ) do FSendQueue.Enqueue( FWaitQueue.Dequeue ); if ( FSendQueue.Count = 0 ) then // hier noch die Abfrage rein, ob der Thread nicht eigentlich beendet werden soll ResetEvent( SendThread.WaitEvent ) else SetEvent( SendThread.WaitEvent ); { CRITICAL-SECTION ENDE } end; |
AW: Konzept: Netzwerkprotokoll
Zitat:
Zitat:
|
AW: Konzept: Netzwerkprotokoll
Zitat:
Der Thread holt sich über die LockList die Transfer-Elemente und kopiert diese. Dann gibt er diese LockList wieder frei. Genau zu diesem Zeitpunkt wird der Thread terminiert (FWaitEvent wird gesetzt und der Thread auf Terminated). Jetzt sind aber keine Elemente in der Liste, also setzt der Thread das FWaitEvent zurück und wartet darauf, dass das Event kommt (unendlich). Der Thread wird also nicht beendet ;) Dies ist zwar theoretisch aber ich habe bei genau sowas schon die kotzenden Pferde gesehen. Bis du dann dem Entwickler dediziert beschreiben und vor allem nachweisen kannst, dass da was falsch läuft - gute Nacht Marie :evil: Zitat:
![]() Die Send-Queue würde ich aber genau so nehmen und die Reihenfolge nur für die wartenden Transfers berücksichtigen. |
AW: Konzept: Netzwerkprotokoll
Zitat:
Den Comparer werde ich mir mal anschauen. Muss zugeben, dass ich mit den Generic Klassen von Delphi bisher kaum gearbeitet habe. Das Comperator Konzept ist mir allerdings von Java her bekannt. Prinzipiell könnte ich für die "WaitQueue" ja aber auch meine alte Lister weiter verwenden. Eine Frage noch zu deinem Ansatz: Du deklarierst die SendDataPacket Funktion als protected im IOHandler. Die Funktion muss allerdings vom Thread heraus aufgerufen werden. Ich weiß zwar, dass ein Zugriff (sogar auf private) Felder innerhalb der selben Unit klassenübergreifend möglich ist, aber meiner Meinung nach ist das eher schlechter Stil oder nicht? |
AW: Konzept: Netzwerkprotokoll
Zitat:
Die Methode SendDataPacket soll vom Thread aufgerufen werden können, aber nicht vom Rest der Welt. Bei einigen Programmiersprachen habe ich diese Möglichkeit nicht und muss diese Methode tatsächlich als public deklarieren, obwohl ich das gar nicht möchte. Delphi bietet mir die Möglichkeit (protected vs. strict protected) warum sollte man das dann nicht nutzen? :) |
AW: Konzept: Netzwerkprotokoll
Zitat:
|
AW: Konzept: Netzwerkprotokoll
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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