Threads führen Codes parallel aus, während der Haupt-Code ebenfalls ungestört weiterläuft.
Mit WaitThread() machst du die eigentliche Funktion von Threads wieder zunichte, weil du wartest jedes Mal auf den vorherigen Thread.
Code: Alles auswählen
aStr = "Nur für Spieler 17"
x=CreateThread(@sende(), SpielerId(17)) ;Nur für Spieler 17
[...]
aStr = "Noch mal ein anderer String an Spieler 17"
x=CreateThread(@sende(), SpielerId(17))
Das funktioniert bei dir nur wegen dem WaitThread() korrekt.
Ohne WaitThread() würdest du dem ersten Thread den zu sendenden String sofort wieder wegnehmen, weil du diesen ja gleich wieder für den zweiten Thread änderst.
Es ist besser, du verwendest für jeden Client eine separate String-Variable, wie ich es im zweiten Beispiel gemacht habe.
So könntest du es ohne WaitThread() machen:
Code: Alles auswählen
Structure SpielerStruc
ClientID.i
String.s
EndStructure
Dim Spieler.SpielerStruc(99)
Procedure Sende(*Spieler.SpielerStruc)
Protected counter,i,sentBytes,gesendet,timer,zeit,l,ok
Protected.s nname
ok=1
l=StringByteLength(*Spieler\String, #PB_Ascii)
timer=ElapsedMilliseconds()
If *Spieler\ClientID>0
Repeat
gesendet=SendNetworkString(*Spieler\ClientID, *Spieler\String, #PB_Ascii)
If gesendet=-1
Delay(20)
Else
sentBytes+gesendet
EndIf
zeit=ElapsedMilliseconds()-timer
Until sentBytes=L Or zeit>60
If zeit>60
ok=0
EndIf
If ok=1
Debug "Iconstringlänge: "+Str(sentBytes)+" gesendet (Original: "+Str(l)
EndIf
ProcedureReturn ok
EndIf
EndProcedure
Spieler(0)\ClientID = ; SpielerID
Spieler(0)\String = "String für einen Client"
CreateThread(@sende(), @Spieler(0))
Spieler(1)\ClientID = ; SpielerID
Spieler(1)\String = "String für anderen Client"
CreateThread(@sende(), @Spieler(1))
OpenWindow(0, 0, 0, 300, 100, "Mein Programm", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Durch das leere Fenster läuft das Programm weiter und kann später sauber beendet werden, ohne es per Taskmanager abschießen zu müssen.
stevie1401 hat geschrieben:Spieleserver
Es wäre für uns von Vorteil, wenn wir von dir wüssten, was dieser alles können muss.
stevie1401 hat geschrieben:Gibt es irgendwo ein funktionierendes Beispiel, welches auch Laien einigermaßen verstehen können?
Netzwerk-Sachen sind eben nicht einfach.
Sendest du mehrere Strings von einem Client, kommen die Strings beim Server nicht getrennt an, wie du sie gesendet hast, sondern an einem Stück gekettet. Um das Trennen der Strings musst du dich dann selber kümmern, indem du für jeden String noch die String-Länge mitsendest, damit du beim Server weißt, wo der erste String aufhört und der nächste String beginnt.
Wenn du mir sagst, was du bei der Verwendung meines Moduls "NetworkManager" nicht verstehst, kann ich ihn vielleicht noch etwas für dich vereinfachen.