networkServer.pb: cpu-auslastung

Anfängerfragen zum Programmieren mit PureBasic.
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

networkServer.pb: cpu-auslastung

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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?
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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?
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag von HeX0R »

broozar hat geschrieben:vielleicht ein bug der 4.41?
Vielleicht ein Bug im unsichtbaren Rest des Codes?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: networkServer.pb: cpu-auslastung

Beitrag von Kiffi »

broozar hat geschrieben:vielleicht ein bug der 4.41?
aktuell ist die 4.51

Grüße ... Kiffi
a²+b²=mc²
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag 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...
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: networkServer.pb: cpu-auslastung

Beitrag von broozar »

4%. da du aber automatisch idlest dank waitwindowevent... außerdem bin ich auf die konsole angewiesen.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Antworten