| 
				
					|  | 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, 00: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: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 10.03.2013, 13: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, 13: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: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 10.03.2013, 13: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, 20: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: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 10.03.2013, 20: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, 20: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.
 
 |  |