Hungriges Programm

Anfängerfragen zum Programmieren mit PureBasic.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Hungriges Programm

Beitrag von Raphi »

Hallo Leute.

Ich habe ein kleines Chat Programm geschrieben, das zu viele Ressourcen verbraucht.
Kann ich das Irgendwie ändern?

Code: Alles auswählen

If InitNetwork() = 0

  MessageRequester("Error", "Netzwerk konnte nicht Initialisiert werden!", 0)
  End
  
EndIf

;*********************************************************************

Global Port = 6832
Global ConnectionID
Global SEvent
Global Text$
Global *Buffer = AllocateMemory(1000)
Global name$

;********************************************************************************

Procedure CEV(x)

Repeat

 SEvent = NetworkClientEvent(ConnectionID) 

    If SEvent
        
        Select SEvent
        
        Case 2
        
          ReceiveNetworkData(ConnectionID, *Buffer, 1000)
          AddGadgetItem (0, -1, "An "+name$+": "+PeekS(*Buffer))
          n+1
          SetGadgetState(0, n)
          
        EndSelect
      
    EndIf
    
ForEver 

EndProcedure

Procedure ServerSendung()

If SendNetworkString(ConnectionID, Text$)

  CloseNetworkConnection(ConnectionID)
  ConnectionID=OpenNetworkConnection("169.254.77.235", Port)
  
Else

  MessageRequester("Error","Naricht konnt nicht gesendet werden")

EndIf

  EndProcedure

Procedure Fenster()
 
Text$=InputRequester("Naricht","Test hier eingeben","Hallo")
  
ServerSendung()

EndProcedure

Procedure Liste(x)

If OpenWindow(0, 100, 0, 270, 600, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0, 10, 10, 250, 580)
    
      
      AddGadgetItem (0, -1, "Chat Verlauf")
   
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
  EndProcedure

;*****************************************************************************************

Name$=InputRequester("Name","Bitte geben sie ihren namen ein","Herr ...")

ConnectionID=OpenNetworkConnection("169.254.77.235", Port)
Debug ConnectionID

CreateThread(@CEV(),1)
CreateThread(@Liste(),1)

;********************Hauptschleife**********************************************

Repeat 

  Fenster()

Until Quit = 1 

;***************************************************************************************

Result=MessageRequester("PureBasic - Server", "Client beenden?",1 )
  
If Result=1

  If Not CloseNetworkConnection(ConnectionID)
  
    MessageRequester("Server", "Der Client konnte nicht beendet werden",0 )
  
  Else
  
    MessageRequester("Server", "Der Client wurde Beendet",0 )
  
  EndIf
  
EndIf
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Hungriges Programm

Beitrag von jojo1541 »

das Serverprogramm wäre praktisch, da man sonst nicht wirklich was testen kann...

Edit: Wenn ich mir das gerade so ansehe, warum schließt du dauernd die Verbindung, nur um sie dann wieder aufzubauen?

Und Resourcen fressen tut es, weil du einen Thread volle Möhre in einer Repeat-schleife laufen hast, ohne ein Delay() reinzusetzten, welches der CPU Luft verschaffen könnte.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Hungriges Programm

Beitrag von Raphi »

jojo1541 hat geschrieben: Edit: wenn ich mir das gerade so ansehe, warum schließt du dauernd die Verbindung, nur um si dann wieder aufzubauen?
Tja irgendwie hat es bei mir die Datei nicht abgeschickt wenn ich die Verbindung nicht geschlossen habe

Jedenfalls hier das Server Programm:

Code: Alles auswählen

If InitNetwork() = 0

  MessageRequester("Error", "Netzwerk konnte nicht Initialisiert werden!", 0)
  End
  
EndIf

;*********************************************************************

Global     Port = 6832
Global  *Buffer = AllocateMemory(1000)
Global ClientID
Global    Text$
Global   SEvent
Global Name$

;********************************************************************************

Procedure CEV(x)


Repeat

  SEvent = NetworkServerEvent() 
  
    If SEvent
     
      ClientID = EventClient()
      
        Select SEvent
        
        Case 1
        
          If x=0
          
            MessageRequester("PureBasic - Server", "A new client has connected !"+Str(ClientID), 0)
            x=1
  
          EndIf
  
        Case 2
          
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          AddGadgetItem (0, -1, "An "+name$+": "+PeekS(*Buffer))
          n+1
          SetGadgetState(0, n)

      EndSelect
     
    EndIf
    
ForEver

EndProcedure

Procedure ServerS()

If SendNetworkString(ClientID, Text$)

Else

  MessageRequester("PureBasic - Server", "Client nicht gefunden", 0)
     
EndIf


  EndProcedure

Procedure Fenster()



  Text$ = InputRequester("Naricht", "Text hier eingeben","Hallo")
  ServerS()



EndProcedure

Procedure Liste(x)

If OpenWindow(0, 100, 0, 270, 600, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0, 10, 10, 250, 580)
    
      
      AddGadgetItem (0, -1, "Chat Verlauf")
   
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
  EndProcedure

;******************************************************************************************************

Name$=InputRequester("Name","Bitte geben sie ihren namen ein","Herr ...")



If CreateNetworkServer(1, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  CreateThread(@CEV(),1)
  CreateThread(@Liste(),1)
 
  
;*****************************************Hauptschleife*******************************************
 
Repeat
   
  Fenster()
    
Until Quit = 1 
  
;*****************************************************************************************************

  Result=MessageRequester("PureBasic - Server", "Server beenden?",1 )
  
  If Result=1
  
    If Not CloseNetworkServer(1)
    
      MessageRequester("Server", "Der Server konnte nicht beendet werden",0 )
      
    Else
    
      MessageRequester("Server", "Der Server wurde Beendet",0 )
      
    EndIf
    
  EndIf
  
Else

  MessageRequester("Error", "Server konnte nicht erstellt werden", 0)
  
EndIf

Ist aber noch nicht Hundertprozentig richtig!

Das Fenster wo die narichten aufgelistet werden lässt sich nämlich, nachdem die erste naricht abgeschickt wurde, nicht mehr zum aktiven fenster machen!
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Hungriges Programm

Beitrag von jojo1541 »

Wie ich schon sagte, ein Delay sowohl im Server als auch im Clienten hilft weiter.(bei dem Ressourcenproblem) :wink:

Nebenbei solltest du den Senden-dialog ändern, mit nem Button aufrufen lassen, oder so. Es ist ziemlich nervig, wenn man dauernd einen Inputrequester aufpoppen hat.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Hungriges Programm

Beitrag von Raphi »

Danke für den Tipp. :allright:

Aber kann es dann nicht sein dass nicht alle narichten empfangen werden?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Hungriges Programm

Beitrag von STARGÅTE »

Doch weil die alle ja im "Buffer" landen den du dann jedoch "richtig" auslesen musst

das heißt du musst bei
ReceiveNetworkData(ClientID, *Buffer, 1000)
noch das Result abfragn, falls dieses gleich der EinleseLänge ist "könnte" noch mehr da sein zum einlesen.

Das Delay sollte außerdem nicht immer statt finden, sonden nur wen nix passiert zB:

Code: Alles auswählen

Select NetworkServerEvent()         
  Case #PB_NetworkEvent_Connect
  Case #PB_NetworkEvent_Data          
  ;...
  Case 0 ; Nix passiert
    Delay(10)
EndSelect
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
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Beitrag von Raphi »

Danke für den Tipp :allright:
Antworten