Seite 1 von 1
Netzwerkcode in einem Thread laufen lassen
Verfasst: 28.06.2006 13:20
von smateja
Hallo zusammen - ich quäle mich gerade ein wenig mit Threads herum und dachte mir - es müsste doch eigetnlich möglich sein - Netzwerkanfragen in nem Thread verarbeiten zu lassen - hab auch fleißig (2 mins - sorry) mal rumexperimentiert - nur häng ich mal wieder - evtl. kann mir wer hier unter die Arme greifen:
Code: Alles auswählen
OpenWindow(0001,1,1,800,600,"Server Engine",#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0001))
InitNetwork()
Procedure UpdateServer()
OpenConsole()
ConsoleTitle("Console Output")
CreateNetworkServer(0002, 7070,#PB_Network_TCP)
UpdateServerEvent = NetworkServerEvent()
If UpdateServerEvent
ClientID = EventClient()
Select UpdateServerEvent
Case 1
PrintN("PureBasic - Server"+ "A new client has connected !")
Case 2
PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has send a packet !")
PrintN("Info"+ "String: "+PeekS(Buffer))
Case 3
PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has send a file via the network !")
Case 4
PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has closed the connexion...")
EndSelect
EndIf
WindowEvent()
EndProcedure
CreateThread(@UpdateServer(),0)
Repeat
WaitWindowEvent()
Until Exit=1
Problematik ist hier - dass er die Console nicht Updatet - jemand n lösungsvorschlag etc?
Verfasst: 28.06.2006 13:26
von MVXA
Schiele ich oder sehe ich im Thread keine schleife

? Die ist wichtig, da
der Thread sonst nach einem Durchlauf sofort toter Mann spielt.
RE:
Verfasst: 28.06.2006 13:26
von smateja
gut erkannt - allerdings nicht mal einmal macht er das - somit mal einfach die schleife vergessen oki ? - Naja der CLient sagt dann schon dass er den Server gefunden hat und sich verbinden kann - aber ich bekomme absolut 0,0 output an der console ? mhmm ?!
Verfasst: 28.06.2006 13:30
von bobobo
wirf deinen Code mal weg unbd nimm den mitgelieferten NetworkServercode im Example Sources Verzeichnis
den ver"threadest" Du dann mal
und beachte mal die Repeat-Schleife im Server
RE:
Verfasst: 28.06.2006 13:33
von smateja
das ist doch der code aus dem mitgeliefertem beispiel nur anstelle mir n popup zu machen (was anbei auch net geht wenns im thread steht) soller ers mir dank print befehl in die console ausgeben ?! und ob da ne schleife drin ist oder net - spielt das so ne große rolle zum testen - mir persönlich reicht das ja wenns genau einaml durchlaufenwürde ?! - ich checks irgendwie noch net?!
Verfasst: 28.06.2006 13:35
von MVXA
Kann da bo³ nur zustimmen. Serveraufgaben und Paketempfang machen
aber dann in einem extra Thread Sinn, wenn Pakete nicht im selben Thread
verarbeitet werden. Merken!
Edit:
sollte schnell werden. Du brauchst die Schleife, um mehrmals die Ereignisse
abzufragen. Wenn das ganze nur einmal durchläuft, fragst du ja nur einmal
das Ereigniss ab. Dann ist schluss. Wenn der Client danach erst connected,
schaust du ja im Postfach nicht mehr nach, ob da was neues drine ist.
Postfach - Ereignissschleife
Ereigniss - Events
Verfasst: 28.06.2006 13:44
von bobobo
der networkserver von PB als Konsole und gethreadet und mit wenig resourcenVerbrauch dank ThreadPriority() und Delay()
Code: Alles auswählen
Global ClientID.l
Procedure server()
Port = 6832
Buffer = AllocateMemory(1000)
If CreateNetworkServer(0, Port)
PrintN("PureBasic - Server "+ "Server created (Port "+Str(Port)+").")
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case 1
PrintN("PureBasic - Server "+ "A new client has connected !")
Case 2
PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has send a packet !")
ReceiveNetworkData(ClientID, Buffer, 1000)
PrintN("Info" +"String: "+PeekS(Buffer))
Case 3
PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has send a file via the network !")
ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
Case 4
PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has closed the connexion...")
Quit = 1
EndSelect
EndIf
Delay(5) ; Systemresourccen runter
Until Quit = 1
PrintN("PureBasic - Server "+ "closeWindow to quit the server.")
CloseNetworkServer(0)
Else
PrintN("Error "+ "Can't create the server (port in use ?).")
EndIf
EndProcedure
OpenConsole()
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
tid=CreateThread(@server(),0)
PrintN("Prio von "+Str( ThreadPriority(tid,1))+" auf 1") ; Systemresourccen runter
Input()
CloseConsole()
End
re:
Verfasst: 28.06.2006 13:44
von smateja
okay - klingt eigentlich nur logisch - gleich mal checken *G
Nachtrag: Baut man die Schleife ein - schon rocked das Teil *G lol
Meric an alle die sich da haben rumquälen müssen mit mir

Verfasst: 28.06.2006 13:45
von bobobo
nimm das da oben