|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 10.03.2013, 01:33 Titel: TSNE_Play ... Senden von mehreren Daten |
|
|
Ich glaube TSNE hasst mich.
Folgendes Problem diesesmal:
Nachdem sich ein Spieler erfoglreich mit seinem Nick auf meinem Server angemeldet hat, sollen verschieden Daten an den Client geschickt werden. Solange ich die Funktion zum Datenverschicken auch nur einmal aufrufe, klappt das auch ganz gut. Sobald ich es allerdings mehrmals tue, bleibt das Programm hängen.
Das ist das Stück Code, welches an den Client einige Daten schicken soll:
Code: | If nick=PLAYER(i).NICK Then
Print "Player "+nick+" has joined the game"
TSNEPlay_SendData(id,"NICKFOUND")
TSNEPlay_SendData(id,"SECTOR "+sectorname)
TSNEPlay_SendData(id,"READY") |
Falls der Spieler also einen Account hat, wird ihm der String "NICKFOUND" geschickt. Danach folgen einige andere Daten(in diesem Fall nur "SECTOR") und der String "READY". Über diesen String soll dem Client gesagt werden, dass er alle Daten erhalten hat und nun das Spiel starten kann.
Dieser Code soll die Daten im Client empfangen:
Code: | Do
Sleep 1,1
If context="NICKNOTFOUND" Then
EndAndCloseConnection()
Elseif Instr(context,"SECTOR") Then
sectorname=Mid(context,8)
Elseif context="READY" Then
Exit Do
Else
End If
Loop |
context sind jeweils die empfangenden Daten. Dummerweise verlässt er diese Schleife nie, es sei denn, ich lasse die ersten beiden Aufrufe von "TSNEPlay_SendData" im Server weg und sende dem Client nur den String "READY". Dann verlässt er die Schleife. Dummerweise benötige ich die anderen Daten auch noch. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 10.03.2013, 14:14 Titel: |
|
|
na, wieso sollte er die schleife auch verlassen?
gibt ja keinen grund dafür.
Einzigst bei "READY" hast du ein exit do drin.
Ist die schleife im event für den datenempfang drin? .. wenn ja, das funzt nicht.
1. aufruf daten senden
2. tsne sendet
3. tsne kehrt von aufruf zurück
4. aufruf daten senden-2
5. tsne sendet
6. tsne kehrt von aufruf zurück
1. tsne empfägt daten
2. tsne bereitet sie auf
3. tsne ruft sub (callback) auf
4. dein code im callback wird abgearbeitet
5. callback kehrt von aufruf zurück an tsne (exit sub)
6. fängt wieder bei 1 an.
es ist also seriell.
wenn du 2x daten schickst, in 2 aufrufe, dann kommt bei dir auf der gegenseite das ganze auch in 2 callback ereignisse an.
machst du also ein do loop im callback, gibst du die kontrolle nicht an tsne zurück. woraufhin diese auch keine weiteren daten empfängt.
wenn dem so wär, müsste es ja quasi parallel zum callbackaufruf daten duch den stack in V_Data schicken .. ich glaube, das is technisch nichtmal möglich
ich hoffe, ich habs nicht zu verknotet erklärt.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 10.03.2013, 14:30 Titel: |
|
|
Zitat: | ich hoffe, ich habs nicht zu verknotet erklärt. |
Eine Loop im Callback, etwa so?
Code: | Sub TSNEPlay_Data(von As Uinteger, zu As Uinteger, daten As String)
Do
context=daten
Loop Until daten=""
End Sub |
|
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 10.03.2013, 14:35 Titel: |
|
|
jo. genau.
ansich kann man sowas schon machen. aber, wenn du auf daten von diesem callback wartest, in der loop, dann wirst du diese nie erhalten.
der aufruf des callbacks ist equeivalent zum aufruf der entsprechenden send_function.
pro send, 1 aufruf.
jede verbindugn überträgt die daten nacheinander, also seriel.
parallel sind nur die verbindugnen selbst.
habe ich 3 verbindungen zu einem server, dann arbeiten diese gleichzeitig. aber die daten die über jede verbindung läuft, kommen nur nacheinander an.
po empfangenen daten wird das callback aufgerufen. ist es blockiert, dann wartet tsne solange, bis sie wieder frei ist. Anders ausgedrückt, bis sie returned
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 10.03.2013, 21:08 Titel: |
|
|
Und wie empfange ich dann alle drei Werte?
Die Schleife in Play_Data hat nicht geholfen. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 10.03.2013, 21:28 Titel: |
|
|
wenn die 3 daten seperat verschickt werden, dann kommen die auch in 3 aufeinander folgende callback ereignisse an.
zu vergleichen mit
Code: |
sub callback(V_data)
print v_data
end sub
callback("NICKFOUND")
callback("SECTOR "+sectorname)
callback("READY")
|
wenn du also in die callbackroutine (TSNEPlay_Data) eien Do-Loop rein baust, dann kommen die 2 weitern nicht an
folglich darfst du dort keine do loop einbauen, dei darauf wartet, ob daten ankommen.
stat
Code: |
Sub TSNEPlay_Data(von As Uinteger, zu As Uinteger, daten As String)
Do
Sleep 1,1
If daten="NICKNOTFOUND" Then
EndAndCloseConnection()
Elseif Instr(daten,"SECTOR") Then
sectorname=Mid(daten,8)
Elseif daten="READY" Then
Exit Do
Else
End If
Loop
End Sub
|
schreibst du entsprechend nur
Code: |
Sub TSNEPlay_Data(von As Uinteger, zu As Uinteger, daten As String)
If daten="NICKNOTFOUND" Then
EndAndCloseConnection()
Elseif Instr(daten,"SECTOR") Then
sectorname=Mid(daten,8)
Elseif daten="READY" Then
Exit Do
Else
End If
End Sub
|
die aufrufe folgen dann entsprechend nacheinander.
PS: habe "context" durch "daten" ersetzt. da dieses die datenvariable im callback ist und dort die empfangenden daten stehen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 10.03.2013, 21:52 Titel: |
|
|
Ui, das funktioniert ja sogar. Danke du |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|