Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

TSNE_Play ... Senden von mehreren Daten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 10.03.2013, 00:33    Titel: TSNE_Play ... Senden von mehreren Daten Antworten mit Zitat

Ich glaube TSNE hasst mich. traurig

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. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 10.03.2013, 13:14    Titel: Antworten mit Zitat

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 Zunge rausstrecken


ich hoffe, ich habs nicht zu verknotet erklärt.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 10.03.2013, 13:30    Titel: Antworten mit Zitat

Zitat:
ich hoffe, ich habs nicht zu verknotet erklärt.

neutral

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 10.03.2013, 13:35    Titel: Antworten mit Zitat

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 zwinkern


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 10.03.2013, 20:08    Titel: Antworten mit Zitat

Und wie empfange ich dann alle drei Werte?
Die Schleife in Play_Data hat nicht geholfen. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 10.03.2013, 20:28    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 10.03.2013, 20:52    Titel: Antworten mit Zitat

Ui, das funktioniert ja sogar. Danke du lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz