SendNetworkData_Safe()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

SendNetworkData_Safe()

Beitrag von cxAlex »

Ein kleines Snippet um Daten "sicher" zu übertragen. Exakt selber Syntax wie SendNetwork Data nur mit optinalem Retry - Parametern, um die Daten nochmal zu senden falls es beim ersten mal nicht geklappt hat.

Schlagt mich nicht weil ein Goto drin ist, einmal in 100 Jahren wird mans wohl verwenden dürfen :mrgreen: . (Ist an der Stelle für mich wirklich übersichtlicher als eine Lösung mit einer Schleife)
Wikipedia hat geschrieben:In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GoTo zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt. Besonders in zeitkritischen Programmteilen ist ein goto deutlich effektiver als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen.

Code: Alles auswählen

; Verwenden wie SendNetworkData
Procedure SendNetworkData_Safe(ConnectionID, *MemoryBuffer, Lenght, MaximumRetrys = 3, Delay = 10)
  Protected Retrys, RtVar, OffSet
  
  _SafeNetworkSend_Jump:
  RtVar = SendNetworkData(ConnectionID, *MemoryBuffer + OffSet, Lenght-OffSet)
  
  If (RtVar + OffSet)<Lenght ; zu wenig gesendet
    If Retrys<MaximumRetrys ; sind noch Versuche übrig?
      If RtVar> -1
        OffSet + RtVar ; Offset erhöhen
      EndIf
      Retrys + 1
      Delay(Delay) ; ein bisschen warten
      Goto _SafeNetworkSend_Jump ; nochmal
    EndIf
  EndIf
  
  ProcedureReturn RtVar
EndProcedure
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Little John

Beitrag von Little John »

Hier inhaltlich exakt der gleiche Code, diesmal mit einer While-Schleife:

Code: Alles auswählen

; Verwenden wie SendNetworkData
Procedure SendNetworkData_Safe(ConnectionID, *MemoryBuffer, Lenght, MaximumRetrys = 3, Delay = 10)
  Protected Retrys, RtVar, OffSet

   RtVar = SendNetworkData(ConnectionID, *MemoryBuffer+OffSet, Lenght-OffSet)
   While (RtVar+OffSet) < Lenght And Retrys < MaximumRetrys
      If RtVar > -1
         OffSet + RtVar
      EndIf
      Retrys + 1
      Delay(Delay)
      RtVar = SendNetworkData(ConnectionID, *MemoryBuffer+OffSet, Lenght-OffSet)
   Wend
 
  ProcedureReturn RtVar
EndProcedure
Gruß, Little John
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Meine Konstruktion gefällt mir trozdem besser :mrgreen: .
Ich hatte es vorher auch so, aber mich stört das ich dann 2* SendNetworkData() verwenden muss wenn ich Standartmäßig keine Verzögerung will.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Little John

Beitrag von Little John »

Das hab' ich mir fast gedacht. ;-)
Aber so kann nun jeder Leser das nehmen, was ihm selbst am besten gefällt.

Gruß, Little John
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Jo, hast recht. Normal verwend ich kein Goto, das hier für mich einer der in Wikipedia genannten Außnahmen. Das erinnert mich an einen Test in Informatik vor 2 Jahren :mrgreen: :
Prof.: "Und programmieren sie das, und das und...."
Prof.: "Aigner?"
Ich.: "Ja?"
Prof.: "Wenn sie Goto verwenden gibts ne 3 Grad schlechtere Note"
Ich.: "Und GoSub?"
Prof.: " Aigner?!!"
Ich.: "Ok, dann nur ein Break.... "
Später hat er mir noch gedroht ich müsste alles in ASM programmieren, dann hab ich ihn freundlich darauf hingewießen das ich da um Jumps nicht herumkommen werde :lol: .
Zuletzt geändert von cxAlex am 03.03.2009 20:29, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

cxAlex' Informatikunterricht hat geschrieben:Prof.: "Und programmieren sie das, und das und...."
Prof.: "Aigner?"
Ich.: "Ja?"
Prof.: "Wenn sie Goto verwenden gibts ne 3 Grad schlechtere Note"
Ich.: "Und GoSub?"
Prof.: " Aigner?!!"
Ich.: "Ok, dann nur ein Break.... "
:lol:
Win11 x64 | PB 6.20
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

[ot]
Mit dem Professor hatte ich schon ein paar sehr "lustige" Dialoge. Erst kürzlich:

Ich hab ein Buch von Hohlbein auf dem Tisch liegen (Chroniken der Unsterblichen):
Mein Informatikunterricht hat geschrieben:Prof.: "Was lesen Sie denn da Aigner?" *Nimmt das Buch und sieht es sich an*
Prof.: "Ah, Hohlbein. Pffffff."
Aigner.: "Haben sie was gegen Hohlbein?"
Prof.: "Hohlbein ist'n totaler Topfn"
Aigner (& Huspek).: *laut* "Hohlbein ftw!"
Prof.:"Geh. Meine Tocher sagt bei Hohlbein ist ein Buch wie das andere"
Aigner.: "Ihre Tochter kennt sich nicht aus"
Prof.: "I kenn mei Tochter a bissl besser als Sie Aigner."
Aigner.: "Sicher... ?"
Prof.: "Aigner!!"
[/ot]
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Little John

Beitrag von Little John »

cxAlex hat geschrieben:das hier für mich einer der in Wikipedia genannten Außnahmen.
Das was Du oben aus Wikipedia zitiert hast trifft hier IMHO nicht zu, denn hier führt weder der Verzicht auf GoTo zu sehr aufwändigen Konstrukten, noch wird am am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchgeführt.
cxAlex hat geschrieben:Das erinnert mich an einen Test in Informatik vor 2 Jahren :mrgreen: :

Prof.: "Und programmieren sie das, und das und...."
Prof.: "Aigner?"
Ich.: "Ja?"
Prof.: "Wenn sie Goto verwenden gibts ne 3 Grad schlechtere Note"
Ich.: "Und GoSub?"
Prof.: " Aigner?!!"
Ich.: "Ok, dann nur ein Break.... "

Später hat er mir noch gedroht ich müsste alles in ASM programmieren, dann hab ich ihn freundlich darauf hingewießen das ich da um Jumps nicht herumkommen werde :lol: .
:lol:

Das erinnert mich daran, dass ich von einem meiner ehemaligen Profs. noch ein Bügeleisen zu bekommen habe, welches ich mal bei einer Wette gewonnen habe. Ich weiß im Moment allerdings nicht mal mehr wie der Prof. hieß ... :-)

Gruß, Little John
Little John

Beitrag von Little John »

cxAlex hat geschrieben:Aigner.: "Ihre Tochter kennt sich nicht aus"
Prof.: "I kenn mei Tochter a bissl besser als Sie Aigner."
Aigner.: "Sicher... ?"
Prof.: "Aigner!!"
:lol:

Willst Du nicht mal in der Laberecke ne regelmäßige Kolumne mit Geschichten von Dir und Deinem Professor aufmachen? Das wäre bestimmt sehr lustig.

Gruß, Little John
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> aber mich stört das ich dann 2* SendNetworkData()
Totaler Blödsinn :freak:
Ansonsten keine kopfgesteuerte Schleife, sondern eine fußgesteuerte
Schleife, um das zu vermeiden.

goto, wir schreiben das Jahr 2009 ...
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten