AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Konzept: Netzwerkprotokoll
Thema durchsuchen
Ansicht
Themen-Optionen

Konzept: Netzwerkprotokoll

Offene Frage von "BUG"
Ein Thema von Zacherl · begonnen am 18. Sep 2012 · letzter Beitrag vom 25. Sep 2012
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Konzept: Netzwerkprotokoll

  Alt 24. Sep 2012, 19:31
Also die Terminierung des Threads sollte soweit funktionieren (hat sie auch in meinen Tests ).
Ich habe auch nicht gesagt, dass das nicht funktioniert, es gibt aber ein ganz schmales Zeitfenster, wo das nicht funktioniert.
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Sep 2012 um 19:43 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 15:48 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