Textfelder werden nicht geupdated

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

 

gamble

Betreff: Textfelder werden nicht geupdated

BeitragFr, Mai 27, 2005 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

bastel im Moment ein wenig mit BlitzPlus herum. Habe nun folgendes Problem:

Ich schicke einem Server eine Anfrage, werte diese aus und will die Ergebnisse dann in Textfelder eintragen. An sich kein großes Problem, allerdings werden die Textfelder nur geupdated, wenn ich vor der Abfrage-Schleife einmal Notify aufrufe. Wenn ich das nicht mache, bleiben die Textfelder leer. Wie kann das denn angehen?!

Artemis

BeitragFr, Mai 27, 2005 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
tu mal den code mit dem updaten!
das ist sehr komsich!
 

gamble

BeitragFr, Mai 27, 2005 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

die komplette Funktion:

BlitzBasic: [AUSKLAPPEN]

Function SendInfoRequest%(IP$,ServerPort%,timeout%)

; Zeit speichern
Local time1 = MilliSecs()

; Stream erstellen
Local udp = CreateUDPStream(ServerPort)

; Request in den Stream schreiben
WriteByte udp,$FF
WriteByte udp,$FF
WriteByte udp,$FF
WriteByte udp,$FF
WriteByte udp,$54
WriteByte udp,$53
WriteByte udp,$6F
WriteByte udp,$75
WriteByte udp,$72
WriteByte udp,$63
WriteByte udp,$65
WriteByte udp,$20
WriteByte udp,$45
WriteByte udp,$6E
WriteByte udp,$67
WriteByte udp,$69
WriteByte udp,$6E
WriteByte udp,$65
WriteByte udp,$20
WriteByte udp,$51
WriteByte udp,$75
WriteByte udp,$65
WriteByte udp,$72
WriteByte udp,$70
WriteByte udp,$00

Local ServerIP% = INT_IP(IP)

; Nachricht an den Server schicken
SendUDPMsg(udp,ServerIP,ServerPort)

Local found = 0

; Funktioniert nur, wenn hier ein Notify steht!

Repeat

; Überprüfen ob es einen Timeout gibt
If MilliSecs()-time1 > timeout Then

Return 1

End If

; Überprüfen ob eine Nachricht eingetroffen ist
If RecvUDPMsg(udp) Then

; TServerList Objekt erstellen
Local a.TServerList

; Alle TServerList Einträge abfragen
For a = Each TServerList

; Wenn es schon einen Eintrag für den
; abzufragenden Server gibt ...
If a\IP$ = IP$ And a\Port = ServerPort Then

; found = 1
found = 1

; -1 lesen
a\server\OK = ReadInt(udp)

; Request auslesen
a\server\Typ = ReadByte(udp)

; Protokollversion auslesen
a\server\Version = ReadByte(udp)

; Hostname lesen
a\server\Hostname = ReadZeroTerminatedString(udp)

; Map lesen
a\server\Map = ReadZeroTerminatedString(udp)

; Spielverzeichnis lesen
a\server\GameDirectory = ReadZeroTerminatedString(udp)

; Spielname lesen
a\server\GameDescription = ReadZeroTerminatedString(udp)

; Spiel ID lesen
a\server\AppID = ReadShort(udp)

; Anzahl der Spieler lesen
a\server\NumPlayers = ReadByte(udp)

; MaxSpieler lesen
a\server\MaxPlayers = ReadByte(udp)

; Anzahl der Bots lesen
a\server\NumOfBots = ReadByte(udp)

; Server-Typ lesen
a\server\Dedicated = ReadByte(udp)

; OS lesen
a\server\OS = ReadByte(udp)

; Password lesen
a\server\Password = ReadByte(udp)

; Server secure ?
a\server\Secure = ReadByte(udp)

; Spielversion lesen
a\server\GameVersion = ReadZeroTerminatedString(udp)

; Gerade gelesene Daten in die Felder eintragen
SetGadgetText(txtGame,a\server\GameDescription)
SetGadgetText(txtHost,a\server\Hostname)
SetGadgetText(txtMap,a\server\Map)
SetGadgetText(txtSpieler,a\server\NumPlayers + \" von \" + a\server\MaxPlayers)

If a\server\NumOfBots = 0 Then

SetGadgetText(txtBots,\"Keine Bots\")

Else

SetGadgetText(txtBots,a\server\NumOfBots + \" Bots\")

End If

If Chr(a\server\OS) = \"l\" Then

SetGadgetText(txtOS,\"Linux\")

ElseIf Chr(a\server\OS) = \"w\" Then

SetGadgetText(txtOS,\"Windows\")

End If

If Chr(a\server\Dedicated) = \"d\" Then

SetGadgetText(txtTyp,\"Dedicated\")

ElseIf Chr(a\server\Dedicated) = \"l\" Then

SetGadgetText(txtTyp,\"Listen\")

ElseIf Chr(a\server\Dedicated) = \"h\" Then

SetGadgetText(txtTyp,\"HLTV\")

End If

End If

Next


End If

If found = 0 Then

; Neuen TServerInfo erstellen
s.TServerInfo = New TServerInfo

; -1 lesen
s\OK = ReadInt(udp)

; Request auslesen
s\Typ = ReadByte(udp)

; Protokollversion auslesen
s\Version = ReadByte(udp)

; Hostname lesen
s\Hostname = ReadZeroTerminatedString(udp)

; Map lesen
s\Map = ReadZeroTerminatedString(udp)

; Spielverzeichnis lesen
s\GameDirectory = ReadZeroTerminatedString(udp)

; Spielname lesen
s\GameDescription = ReadZeroTerminatedString(udp)

; Spiel ID lesen
s\AppID = ReadShort(udp)

; Anzahl der Spieler lesen
s\NumPlayers = ReadByte(udp)

; MaxSpieler lesen
s\MaxPlayers = ReadByte(udp)

; Anzahl der Bots lesen
s\NumOfBots = ReadByte(udp)

; Server-Typ lesen
s\Dedicated = ReadByte(udp)

; OS lesen
s\OS = ReadByte(udp)

; Password lesen
s\Password = ReadByte(udp)

; Server secure ?
s\Secure = ReadByte(udp)

; Spielversion lesen
s\GameVersion = ReadZeroTerminatedString(udp)

; Gerade gelesene Daten in die Felder eintragen
SetGadgetText(txtGame,s\GameDescription)
SetGadgetText(txtHost,s\Hostname)
SetGadgetText(txtMap,s\Map)
SetGadgetText(txtSpieler,s\NumPlayers + \" von \" + s\MaxPlayers)

If s\Password = 0 Then

SetGadgetText(txtPasswort,\"Kein Passwort (public)\")

Else

SetGadgetText(txtPasswort,\"Passwort gesetzt (private)\")

End If

If s\NumOfBots = 0 Then

SetGadgetText(txtBots,\"Keine Bots\")

Else

SetGadgetText(txtBots,s\NumOfBots + \" Bots\")

End If

If Chr(s\OS) = \"l\" Then

SetGadgetText(txtOS,\"Linux\")

ElseIf Chr(s\OS) = \"w\" Then

SetGadgetText(txtOS,\"Windows\")

End If

If Chr(s\Dedicated) = \"d\" Then

SetGadgetText(txtTyp,\"Dedicated\")

ElseIf Chr(s\Dedicated) = \"l\" Then

SetGadgetText(txtTyp,\"Listen\")

ElseIf Chr(s\Dedicated) = \"h\" Then

SetGadgetText(txtTyp,\"HLTV\")

End If

If s\Secure = 0 Then

SetGadgetText(txtSecure,\"VAC disabled\")

Else

SetGadgetText(txtSecure,\"VAC enabled\")

End If

If s\Hostname <> \"\" Then

; Server in TServerList eintragen
Local b.TServerList = New TServerList
b\IP$ = IP$
b\Port% = ServerPort%
b\Hostname = s\Hostname
b\server = s

; Server in Listbox eintragen
AddGadgetItem(lstServer,s\Hostname)

; Serverlist speichern
SaveServerList(\"serverlist.txt\")

End If

End If

CloseUDPStream(udp)

Exit

Forever

End Function


Ich habe jetzt beobachtet das BB die Schleife wohl durchgeht, aber das If RecvUDPMsg auslässt. Wenn ich das Notify vor die Repeat/Forever Schleife schreibe klappt alles.
  • Zuletzt bearbeitet von gamble am Fr, Mai 27, 2005 23:43, insgesamt einmal bearbeitet

Hip Teen

BeitragSa, Mai 28, 2005 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenn mich net wirklich mit Netzwerk usw. aus (jedenfalls unter BB), aber ich glaub es liegt nicht am notify selber, dass es ne magische Wirkung, sondern dass das Notify nur einen Effekt hat, der das ganze Verursacht (erinnert mich irgendwie an eine Vanille Eis Story)
Da ich net den ganzen Code habe, kann ich es net testen, aber versuch mal statt dem Notify dort mal ein "Delay 2000" hinzusetzen. Wenn es dann geht, weiß ich woran es liegt Laughing
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

Artemis

BeitragSa, Mai 28, 2005 8:21
Antworten mit Zitat
Benutzer-Profile anzeigen
liegt vielleicht daran, dass du kein waitevent hast!
bei mir war das auch so, dass es erst nach einem event updated!
 

gamble

BeitragSa, Mai 28, 2005 9:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, das mit dem Delay hat geklappt. Das ist aber .. etwas ungünstig Wink Mit einem Delay von 80 bekomme ich einen Server angezeigt, und wenn die Server-Liste mal größer wird darf der User irgendwann 2-3 Sekunden warten. Muss irgendwie eleganter gehen.

edit: Hatte die Lösung eben. Die if found = 0 Abfrage war außerhalb der Repeat/Until Schleife. Daher ging das Programm aus der Schleife raus und gab nur noch Müll aus. Werde den Code nochmal anständig neu schreiben. Danke für die Hilfe.
  • Zuletzt bearbeitet von gamble am Sa, Mai 28, 2005 10:39, insgesamt einmal bearbeitet

Hip Teen

BeitragSa, Mai 28, 2005 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit dem Delay war nur um sicherzugehen, dass es net am Notify wirklich liegt. Das Problem ist halt, dass der Server ja ne Zeit zum Antworten braucht, das Programm aber schneller am
If RecvUDPMsg(udp) Then
ist, als der Server antworten kann (wenn du verstehst was ich meine ^^).
Du musst das wohl oder übel komplett umschreiben Rolling Eyes
 

gamble

BeitragSa, Mai 28, 2005 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar verstehe ich Wink Das Problem war ja folgendes: Zuerst wurde überprüft ob es den Server schon in der TServerList gibt. Wenn nicht, wurde der Codeabschnitt übersprungen und es wurde ein neuer Server angelegt. Allerdings habe ich das Anlegen des neuen Servers außerhalb der If RecvUDPMsg ... Abfrage gemacht, daher wurde der Server auch angelegt wenn noch keine Antwort da war.

Habs neu geschrieben, läuft jetzt gut.

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group