Seite 1 von 2

Program bleibt hängen (Server)

Verfasst: 06.06.2006 13:21
von cofter
Hi, ich habe einen Consolenserver programmiert, dieser funktioniert auch super. Jetzt möchte ich diesen aber mit Gadgets machen.
Also habe ich mit dem Visualdesigner mir eine Oberfläche erstellt.
Doch wenn ich das Programm jetzt ausführe bleibt es hängen.
Er Öffnet zwar das #MainWindow aber nicht mehr die Gadgets die in dem Window sind. Kann dann immer nur den Prozess killen.
Ich hoffe mir kann einer von euch sagen warum dies so ist und mir einen kleinen Tip geben.
Wäre sehr dankbar.

Verwende Pb 4.0

mfg
Cofter

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #MainWindow
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #Menu_Exit
  #MENU_Hilfe
  #MENU_Ueber
EndEnumeration

;- Gadget Constants
;
Enumeration
  #ServerFrame
  #ListPlayer
  #ConsoleStringGadged
  #CommandGadget
  #SendConsole
EndEnumeration

;- StatusBar Constants
;
Enumeration
  #StatusBar_0
EndEnumeration

;- Procedures
  Procedure Open_MainWindow()

  If OpenWindow(#MainWindow, 240, 147, 746, 524, "Solania Server v0.2b",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateMenu(#MenuBar_0, WindowID(#MainWindow))
      MenuTitle("File")
      MenuItem(#Menu_Exit, "Exit")
      MenuTitle("Options")
      MenuTitle("Info")
      MenuItem(#MENU_Hilfe, "Hilfe")
      MenuItem(#MENU_Ueber, "Über")
      EndIf

      If CreateStatusBar(#StatusBar_0, WindowID(#MainWindow))
        EndIf

        If CreateGadgetList(WindowID(#MainWindow))
          Frame3DGadget(#ServerFrame, 20, 70, 520, 380, "Console")
          ListViewGadget(#ListPlayer, 560, 80, 170, 370)
          StringGadget(#ConsoleStringGadged, 30, 90, 500, 350, "Console v0.2b", #PB_String_ReadOnly)
          StringGadget(#CommandGadget, 20, 460, 520, 30, "Commands")
          ButtonGadget(#SendConsole, 550, 460, 80, 30, "Send Console")
          GadgetToolTip(#SendConsole, "Send Command to Console")
          
        EndIf
      EndIf
EndProcedure

  Procedure recieve_information()
*Buffer = AllocateMemory(50000) ; frisst den speicher auf!!!!
  SEvent = NetworkServerEvent()
  
  If SEvent
    ConsoleColor(15,0)
    ClientID = EventClient()
    
    Select SEvent    
      Case 1
        SetGadgetText(#ConsoleStringGadged,"Neuer Client Connectet! " +Str(ClientID))
      Case 2
        ReceiveNetworkData(ClientID, *Buffer, 50000)
        PrintN(PeekS(*Buffer))
      Case 3
        SetGadgetText(#ConsoleStringGadged,"Client " +Str(ClientID)+ " versucht Datei zu schicken!")
      Case 4
        SetGadgetText(#ConsoleStringGadged,"Client " +Str(ClientID)+ " verlässt den Server")
    EndSelect
  
  EndIf
FreeMemory(*Buffer)
EndProcedure

If InitNetwork()
    in_db = InitDatabase()
    db_examine = ExamineDatabaseDrivers()
    db_driver = NextDatabaseDriver()
    db_descript$ = DatabaseDriverDescription()
    db_driver_name$ = DatabaseDriverName()

    If CreateNetworkServer(0,7000)

        Open_MainWindow()
    Else
        MessageRequester("Error","Server konnte nicht gestartet werden!")
    EndIf
Else
    MessageRequester("Error","Netzwerk konnte nicht initialisiert werden!")
EndIf

Repeat

  recieve_information()
  Delay(1)
ForEver


Verfasst: 06.06.2006 13:27
von AND51
In der Hauptscheife musst du doch per WindoeEvent() abfragen, welche Ereignisse auftreten, sonst kannst du darauf nicht reagieren!

Außerdem wird die CPU sehr stark ausgelastet, wenn du z. B. kein Delay() verwendest - bei mir passiert dies auch manchmal bei Delay(1).

Das mit WindowEvent() sollte die helfen, siehe Hilfe.

Verfasst: 06.06.2006 13:30
von cofter
Au man, da hätte ich echt selber drauf kommen können. :roll: :oops:
Danke für die schnell Antwort!

mfg
Cofter

Verfasst: 06.06.2006 13:31
von AND51
Kein Problem. Und schnell war ich, weil ich gerade zufällig (wie so oft) hier bin. Programmiere aber gerade ein Tool, mit dem ich noch schneller vor Ort sein kann 8)

Verfasst: 06.06.2006 13:35
von Kaeru Gaman
Unendlicher-Unwahrscheinlichkeits-Drive oder
Bistro-O-Matic?

Verfasst: 06.06.2006 13:40
von cofter
Habe noch eine kleine Frage.
Kann ich für die WindowEvent() eine Procedure schreiben das ich dann in der repeat Schleife nur noch WindowProcedure() habe?


Edit:

Ok hat sich erledigt, funktioniert super mit Procedure. :mrgreen:

Verfasst: 06.06.2006 13:42
von Karl
Nee, Matrix-Online-Mikrosoft für die neuronale Schnittstelle hinterm Ohr.

:)

Gruß Karl

Verfasst: 06.06.2006 14:21
von cofter
Habe doch noch eine Frage. :oops:
Wenn der Client jetzt seine Daten an den Server schickt werden diese in ein StringGadget gepackt.
Wie stelle ich es an das er mir die ankommenden Daten in immer in eine neue Zeile packt und nicht das alte überschreibt?
Muss ich da ein SetGadgetData und eine for Schleife verwenden?
Habe jetzt schon ein wenig probiert komme aber nichtzum gewünschtem Ergebnis.

Danke im Vorraus für eure Hilfe.

mfg
Cofter

Verfasst: 06.06.2006 14:30
von edel
Mit addgadgetitem


Beispiel :

Code: Alles auswählen

  OpenWindow(0,#PB_Ignore,#PB_Ignore,320,240,"")
  
  CreateGadgetList(WindowID(0))
  EditorGadget(0,10,10,300,220)
  
  Repeat
    uMsg = WaitWindowEvent()  
    
    If uMsg = #WM_MOUSEMOVE
      
      AddGadgetItem(0,0,"Mauszeiger bewegt sich " + str(i))
      
      i + 1
      
    EndIf
    
  Until uMsg = #WM_CLOSE

Verfasst: 06.06.2006 14:45
von Tafkadasom2k5
@Edel:
Stringgadget glaube ich meinte er, nicht ListGadget...

In dem Fall wär es glaube ich:

Code: Alles auswählen

altText.s = GetGadgetText(#GadgetNummer) + Chr(10) + Chr(13)

SetGadgetText(#GadgetNummer,altText + neuText)
Bei den Chr's bin ich mir nicht mehr so ganz sicher- es muss ein
"Carridge Return" und ein "Line Feed" sein, um den gewünschten Zeilenumbruch zu erzeugen...

Gr33tz
Tafkadasom2k5