Seite 1 von 2
networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 14:22
von broozar
hi,
die exe der networkServer.pb belegt einen ganzen kern mit 100%. ich habe nun versucht, ein dickes delay in die repeat-schleife einzuschmuggeln (200), die last sinkt auf 6%. beeinträchtigt dies die funktions-/reaktionsfähigkeit des servers?
ich will kein echtzeitspiel damit erstellen, sondern nur strings abfangen (chat-ähnlich), die mir ein client alle paar sekunden schickt. als protokoll verwende ich udp (gleicher rechner - übertragungsfehler sollten nicht vorkommen). wenn ein string später ankommt, ist das kein problem, nur verloren gehen sollte er nicht, wenn er grad in einer delay-phase ankommt.
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 14:32
von STARGÅTE
Ein Delay(200) mit jedem Schleifendurchgang ist schlecht.
Denn falls wirklich mehr als ein ServerEvent in diesen 200ms kommt, gehen die Events zwar nicht verloren, aber "stauen" sich an, und die Verzögerung wird größer.
Lösung wäre:
Code: Alles auswählen
Repeat
Select NetworkServerEvent()
Case #PB_NetworkEvent_Connect
Case #PB_NetworkEvent_Data
Case #PB_NetworkEvent_File
Case #PB_NetworkEvent_Disconnect
Default
Delay(100)
EndSelect
Until Quit
Dass heißt, nur dann ein Delay() ausführen wenn alle in den 100ms angestauten Events abgearbeitet wurden.
Edit:
Wenn du ein Chat schreiben willst, und die nachricht nicht verloren gehen sollte, verwende bitte TCP und nicht UDP ...
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 17:59
von broozar
danke. nein, ich will keinen chat schreiben, sondern daten zwischen 2 programmen austauschen, wobei es nicht um wichtige dinge geht, nur ein mitloggen von ereignissen. ja und das funktioniert nicht über stdout aufgrund des designs des anderen programms... frag lieber nicht.
leider klappt dein ansatz nicht. die auslastung bleibt gleichmäßig hoch. noch eine andere idee? ich bin inzwischen dabei:
Code: Alles auswählen
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case 2
ReceiveNetworkData(ClientID, *Buffer, 1000)
PrintN(PeekS(*Buffer))
EndSelect
Else
Delay(200)
EndIf
Until Quit =2
in ordnung oder eher mau?
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 18:50
von STARGÅTE
leider klappt dein ansatz nicht. die auslastung bleibt gleichmäßig hoch
Kan ich nicht nachvollziehen. Bei mir hat dieser Code mit einem Server 0% CPU auslastung.
Wenn du natürlich "im dauerfeuer" Daten sendest dann bleibt dem Server ja nichts anderes übrig als dauerhaft zu arbeiten ...
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 19:08
von broozar
ich sende zu testzwecken jede sekunde einen 20 zeichen langen string. und auch wenn die app, die auf dem port sendet, schon lange abgeschossen ist, bleibt die auslastung voll. vielleicht ein bug der 4.41?
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 21:06
von HeX0R
broozar hat geschrieben:vielleicht ein bug der 4.41?
Vielleicht ein Bug im unsichtbaren Rest des Codes?
Re: networkServer.pb: cpu-auslastung
Verfasst: 30.10.2010 21:14
von Kiffi
broozar hat geschrieben:vielleicht ein bug der 4.41?
aktuell ist die 4.
51
Grüße ... Kiffi
Re: networkServer.pb: cpu-auslastung
Verfasst: 31.10.2010 18:16
von broozar
HeX0R hat geschrieben:Vielleicht ein Bug im unsichtbaren Rest des Codes?
NetworkServer.pb im example-folder.
Kiffi hat geschrieben:aktuell ist die 4.51
ich schreibe gern projekte zuende in der version, mit der ich sie begonnen habe.
ich find meine lösung mit dem if-else gut, die cpu-belastung ist minimal und auch bei/nach eventstau (künstliches anhalten durch input() ) arbeitet sie korrekt weiter.
Re: networkServer.pb: cpu-auslastung
Verfasst: 02.11.2010 18:55
von HeX0R
Hier werden jede Sekunde 30 Zeichen gesendet und was sagt die CPU-Auslastung bei dir?
Code: Alles auswählen
EnableExplicit
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Procedure main()
Protected Port, *Buffer, ClientID, SEvent, R, a$, CID
Port = 6832
*Buffer = AllocateMemory(1000)
If CreateNetworkServer(0, Port)
OpenWindow(0, 0, 0, 300, 300, "Server", $C8001)
ListViewGadget(0, 5, 5, 290, 270)
AddGadgetItem(0, -1, "Server created (Port " + Str(Port) + ").")
ClientID = OpenNetworkConnection("localhost", Port)
If ClientID
AddGadgetItem(0, -1, "Client is here")
Else
AddGadgetItem(0, -1, "No Client... try with 127.0.0.1")
EndIf
;Send any 1000ms a String
AddWindowTimer(0, 0, 1000)
Repeat
Select WaitWindowEvent(5)
Case #PB_Event_CloseWindow
If ClientID
CloseNetworkConnection(ClientID)
ClientID = 0
EndIf
Case #PB_Event_Timer
If ClientID
SendNetworkString(ClientID, "Ui, ich bin ja immernoch da...")
EndIf
EndSelect
SEvent = NetworkServerEvent()
If SEvent
CID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
AddGadgetItem(0, -1, "A new client (" + Str(CID) + ") has connected!")
Case #PB_NetworkEvent_Data
R = ReceiveNetworkData(CID, *Buffer, 1000)
If R > 0
a$ = PeekS(*Buffer, R)
AddGadgetItem(0, -1, "Client " + Str(CID) + " sent: " + a$)
EndIf
Case #PB_NetworkEvent_Disconnect
AddGadgetItem(0, -1, "Client " + Str(CID) + " disconnected!")
Break
EndSelect
EndIf
ForEver
CloseNetworkServer(0)
EndIf
FreeMemory(*Buffer)
EndProcedure
main()
Ich weiß, das ist ein Fenster und keine Konsole, aber wer braucht schon Konsole...
Re: networkServer.pb: cpu-auslastung
Verfasst: 06.11.2010 20:57
von broozar
4%. da du aber automatisch idlest dank waitwindowevent... außerdem bin ich auf die konsole angewiesen.