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! :allright:

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.