Seite 1 von 2
InitNetwork() can be called only once
Verfasst: 11.01.2009 12:02
von Kiffi
Hallo,
ich schreibe derzeit ein Include, in dem Netzwerkfunktionalitäten verwendet
werden. Demzufolge führe ich dort ein InitNetwork() aus.
Wenn nun aber der Code, in dem ich das Include einbinde, ebenfalls ein
InitNetwork() verwendet, dann gibt es einen Debugger-Fehler:
Debugger hat geschrieben:[ERROR]: InitNetwork() can be called only once
wie kann man diese überflüssige Meldung unterdrücken?
Danke im voraus & Grüße ... Kiffi
Re: InitNetwork() can be called only once
Verfasst: 11.01.2009 12:08
von DarkDragon
Kiffi hat geschrieben:Hallo,
ich schreibe derzeit ein Include, in dem Netzwerkfunktionalitäten verwendet
werden. Demzufolge führe ich dort ein InitNetwork() aus.
Wenn nun aber der Code, in dem ich das Include einbinde, ebenfalls ein
InitNetwork() verwendet, dann gibt es einen Debugger-Fehler:
Debugger hat geschrieben:[ERROR]: InitNetwork() can be called only once
wie kann man diese überflüssige Meldung unterdrücken?
Danke im voraus & Grüße ... Kiffi
Code: Alles auswählen
InitNetwork()
DisableDebugger
InitNetwork()
EnableDebugger

So gehts.
Verfasst: 11.01.2009 12:12
von Kaeru Gaman
du kannst in deinem Include sowas einbaun:
Code: Alles auswählen
Procedure NetworkInit()
ProcedureReturn 1
EndProcedure
Macro InitNetwork()
NetworkInit()
EndMacro
das verhindert, dass der andere Programmteil InitNetwork ein zweites Mal aufrufen kann.
... du musst dann allerdings dir was ausfuchsen, wie du von deiner Init-Routine
aus das native InitNetwork aufrufen kannst, ohne in deinem Macro zu landen...
Verfasst: 11.01.2009 12:16
von cxAlex
So läufts ohne Probleme:
Code: Alles auswählen
Procedure NetworkInit()
Static IsNetWorkInit
If Not IsNetWorkInit
IsNetWorkInit = #True
InitNetwork()
EndIf
EndProcedure
Macro InitNetwork()
NetworkInit()
EndMacro
; Zum Testen beide auskommentieren
InitNetwork()
InitNetwork()
CreateNetworkServer(1 ,80) ; Zum Testen
Verfasst: 11.01.2009 12:21
von Kaeru Gaman
> So läufts ohne Probleme:
echt? keine rekursion?
kewl!
Verfasst: 11.01.2009 12:23
von cxAlex
Kaeru Gaman hat geschrieben:> So läufts ohne Probleme:
echt? keine rekursion?
kewl!
Keine Rekursion. Liegt vlt. daran das das Macro in der 1. Procedure noch nicht bekannt ist und der Compiler einfach dann die native Funktion verwendet.
Verfasst: 11.01.2009 12:51
von DarkDragon
Ich würd aber noch den letzten Rückgabewert zurückgeben:
Code: Alles auswählen
Procedure NetworkInit()
Static IsNetWorkInit
Static ReturnValue
If Not IsNetWorkInit
IsNetWorkInit = #True
ReturnValue = InitNetwork()
EndIf
ProcedureReturn ReturnValue
EndProcedure
Wobei das ist ja schon blöd, was wenn InitNetwork nun nicht funktioniert hat, weil kein Netzwerk da ist, dann wartet man, der User installiert ein Netzwerk und nun ruft man wieder InitNetwork auf, welches einen Wert <> 0 zurückgeben sollte und der Debugger meckert das an.
D.h. der Nutzer muss erst das Programm neustarten, damit es das Netzwerk erkennen darf, oder wie darf man das verstehen?
Verfasst: 11.01.2009 13:09
von cxAlex
So, das sollte jetzt korrekt sein:
Code: Alles auswählen
Procedure NetworkInit()
Static IsNetWorkInit
If Not IsNetWorkInit
If InitNetwork()
IsNetWorkInit = #True
EndIf
EndIf
ProcedureReturn IsNetWorkInit
EndProcedure
Macro InitNetwork()
NetworkInit()
EndMacro
; Zum Testen beide auskommentieren
Debug InitNetwork()
Debug InitNetwork()
CreateNetworkServer(1 ,80) ; Zum Testen
Verfasst: 11.01.2009 14:06
von Kiffi
Jungs, Ihr seid spitze!
Danke & Grüße ... Kiffi
Verfasst: 11.01.2009 14:56
von AND51
Code: Alles auswählen
Procedure NetworkInit()
Static IsNetWorkInit
If Not IsNetWorkInit
IsNetWorkInit = InitNetwork()
EndIf
ProcedureReturn IsNetWorkInit
EndProcedure
Macro InitNetwork()
NetworkInit()
EndMacro
; Zum Testen beide auskommentieren
Debug InitNetwork()
Debug InitNetwork()
CreateNetworkServer(1 ,80) ; Zum Testen
So geht es auch ohne
#True Flag und einer zweiten
If-Abfrage.
Wenn mans so macht, kann man
NetworkInit() ohne Probleme auch mehrmals aufrufen, falls die Initialisierung beim 1. Mal nicht geklappt haben solle. Es wird dann immer der korrekte Rückgabewert zurückgegeben und die Initialisierung ggf. nochmal versucht.