Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 10.10.2005, 17:30 Titel: Multithreading Netzwerk |
|
|
Hallo!
Ich habe folgenden Code geschrieben.
Dieser Code stürzt stets ab, sobald die Hauptschleife beginnt(0 0 wird angezeigt, dann stürzt alles ab).
Wieso ist das so und was kann ich da tun? |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 10.10.2005, 18:18 Titel: |
|
|
Hallo.
Ich weiß nicht genau wo dran es liegt, doch meine Programme stürzen immer gerne ab, wenn ich screenlock bzw. screenunlock benutze. Wieso weiß ich nicht, doch probiers mal anders.
Michael |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 10.10.2005, 18:22 Titel: |
|
|
sockclient zum beispiel muss als shared deklariert werden da übergebene parameter an die Subs laut Referenz Integer sein muss und du eventuell den handle nicht übergeben kannst...
Des weiteren würd ich Screenlock erst benutzen wenn ichs brauch..
Ausprobieren kann ich grad ned weil mir die dll fehlt. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Mecki Igel
Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 10.10.2005, 21:06 Titel: |
|
|
So, hab ein wenig weiter gemacht.
http://www.freebasic.de/fbnp?view=69
Das ist der neue Code(mit edit).
Die Library SDL_NET bekommst du Hier, SDL gibs überall.
Ich habe ein wenig mit Sleep experimentiert, es stürzt in den 2 Zeilen ab:
Code: | thread_senden = threadcreate(@senden, 0)'Threads starten
thread_empfangen = threadcreate(@empfangen, 0)'Sub, Parameter | [/url] |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 10.10.2005, 21:58 Titel: |
|
|
ich vermute eher es stürzt in einer der Beiden Subs ab, das macht dann den eindruck als wärs in den beiden zeilen. Also probier mal in den subst weiter wenn du das noch nicht hast. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 11.10.2005, 16:47 Titel: |
|
|
Ok.
Stürzt schon ab.
Wo ist demzufolge in:
Code: | SUB senden(param as integer)
DO
SDLNet_TCP_Send(sharesock, @ubertrag, 2 )
LOOP WHILE threadcontrol=0
END SUB |
Der Fehler? Ich sehe überhaupt keinen. |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 11.10.2005, 17:28 Titel: |
|
|
der SDL_NET-Befehl is das garantiert. Irgendwie stimmt viellicht was mit dem Socket ned oder sonst was. Schau dir halt ma irgendwie die Parameterbeschreibung an. Google hilft beim suchen _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 11.10.2005, 19:04 Titel: |
|
|
Der neue Code:
http://www.freebasic.de/fbnp?view=71
Er startet erstmal, und funktioniert besser.
Der Fehler war recht banal: ich habe vergessen sharesock den Wert von sockclient zuzuweisen.
Leider kommt es nach einer gewissen Zeit zu einem Absturz, der etwas weitergehend ist: irgendwas mit Net und TCP und Ethernet und schwerem Fehler. Danach fährt der Computer runter, will ne Fehlermeldung machen und so weiter.
Mein Tipp wäre, das es an der Geschwindigkeitsdifferenz der Rechner liegt, und das einer dann mehr sendet, der andere das nicht verarbeitet, während der mehr sendende(und weniger empfangene) viel zu wenig entfernt und dann keine Daten mehr hat.
Ich habe aber keine Ahnung, das hab ich mir nur so ausgedacht.
Woran denkt ihr liegt es und wie könnte ich das Problem lösen? |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 11.10.2005, 20:01 Titel: |
|
|
mit "Irgend ein schwerer fehler" wird dir niemand weiterhelfen können.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 11.10.2005, 21:02 Titel: |
|
|
Öhm na ja....ich weiß es ja auch nicht. Da kam nur "Windows wird seit einem schweren Fehler zum ersten mal wieder ausgeführt.blabla. Senden des Berichts?". Und halt vor dem Abstürzen kam noch irgendwas, das hab ich aber nicht wirklich mitbekommen, weil dann der Bildschirm schwarz wird.
/EDIT:
Ja, ok, es lag(wie ich vermutete) daran, das die Computer unterschiedlich schnell sind und so immer mehr gesendet als empfangen wird und das einen "Stau auf der Datenautobahn" hervorruft.
Code
Das ist der nun halbwegs funktionierende Code.
Aber der funktioniert ebenleider nur halbwegs. Seltsamerweise wird nicht, wie angezeigt, -1 übertragen, sondern es kommt dann irgendwie nach dem Drücken oder nachdem es ein bissel gedrückt ist oder so(kann ich nicht genau beobachten; Computer steht zu weit weg und ich komm sonst nicht an die Tastatur ran) 65 000 und noch ä bissl.
Woran liegt das und wie kann man die richtigen Werte übertragen lassen? |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 11.10.2005, 21:41 Titel: |
|
|
65535 vielleicht? Dann kanns sein, dass der nur positive zahlen übertragen kann. Übertrag ma was größer gleich null. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.10.2005, 16:02 Titel: |
|
|
So, gut, jetzt funktioniert es:
Code: | '$include: "SDL/SDL.bi"
'$include: "SDL/SDL_net.bi"
DECLARE SUB senden(param as integer)
DECLARE SUB empfangen(param as integer)
DECLARE SUB Connect(socket as tcpsocket,nummer)
'OPTION EXPLICIT
#ifdef NULL
#undef NULL
#endif
const NULL = 0
DIM SHARED AS byte threadcontrol=0
DIM AS integer thread_senden, thread_empfangen
DIM SHARED ubertrags AS integer
DIM SHARED ubertragr AS integer
DIM e AS integer
DIM eingabe AS string
TYPE netzwerk
links AS integer
rechts AS integer
oben AS integer
unten AS integer
schuss AS integer
END TYPE
REDIM SHARED net(2) AS netzwerk
DIM sockclient AS tcpsocket
DIM SHARED sharesock AS tcpsocket
DIM nummer AS integer
DIM SHARED t#
DIM gegi AS integer
e=0
SCREEN 18,8,3,1
Connect(sockclient, nummer)
IF nummer=1 THEN gegi=2 ELSE gegi=1
sharesock=sockclient
#define delay 0.05
t#=TIMER+delay
thread_senden = threadcreate(@senden, 0)'Threads starten
thread_empfangen = threadcreate(@empfangen, 0)'Sub, Parameter
DO
WHILE TIMER<T#
WEND
t#=TIMER+delay
'Verzögerung
GOSUB resetall
IF MULTIKEY(&h39) THEN net(nummer).schuss=1
IF MULTIKEY(&h01) THEN e=1
Eingabe$=INKEY$
ubertrags=net(nummer).schuss
net(gegi).schuss=ubertragr
SCREENLOCK
CLS
PRINT net(1).schuss
PRINT net(2).schuss
SCREENUNLOCK
'Darstellen
LOOP UNTIL e=1
threadcontrol=1
threadwait thread_senden
threadwait thread_empfangen
CLS
SLEEP
END
resetall:
net(1).links=0
net(1).rechts=0
net(1).oben=0
net(1).unten=0
net(1).schuss=0
net(2).links=0
net(2).rechts=0
net(2).oben=0
net(2).unten=0
net(2).schuss=0
RETURN
SUB senden(param as integer)
DO
WHILE TIMER<T#
WEND
t#=TIMER+delay
SDLNet_TCP_Send(sharesock, @ubertrags, 2 )
LOOP WHILE threadcontrol=0
END SUB
SUB empfangen(param as integer)
DO
WHILE TIMER<T#
WEND
t#=TIMER+delay
SDLNet_TCP_Recv(sharesock, @ubertragr, 2 )
LOOP WHILE threadcontrol=0
END SUB
SUB Connect(socket as tcpsocket,nummer)
DIM dummy AS string
IF SDLNet_Init() <> 0 THEN
PRINT "Fehler"
SLEEP
END
END IF
PRINT "1-Server"
PRINT "2-Client"
DO
dummy$=INKEY$
nummer=VAL(dummy$)
LOOP UNTIL nummer=1 OR nummer=2
DIM sock AS tcpsocket'Socket einstellen
DIM sockclient AS tcpsocket
DIM ip AS ipaddress'Variable IP vom Typ IP Addresse
DIM zahler AS integer
DIM host AS string
IF nummer=1 THEN
SDLNet_Write32( INADDR_ANY, @ip.host )
SDLNet_Write16( 5678, @ip.port )
sock = SDLNet_TCP_Open( @ip )'TCP Verbindung öffnen, in den Socket schreiben
zahler=1
PRINT "Warte auf Client..."
WHILE sockclient = NULL
sockclient = SDLNet_TCP_Accept( sock )
WEND
END IF
IF nummer=2 THEN
INPUT "IP Addresse des Hostes: ", host$
SDLNet_ResolveHost( @ip, host$, 5678 )
sockclient = SDLNet_TCP_Open( @ip )
END IF
socket=sockclient
END SUB
|
Problem ist bloß, das es eine Verzögerung zwischen den Computern von etwa einer Sekunde gibt...sprich, das es nicht schneller als zuvor geht, sondern langsamer. |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.10.2005, 16:27 Titel: |
|
|
aber jetzt hast du zumindest keinen lag mehr drin.. mach doch mal nen konkreten Ping-test. Sende von dem einen was bestimmtes und wenn der andere das bekommt sendet er sofort zurück und du schaust auf dem ausgangsrechner wie lang das gedauert hat. Wenn das wirklich ne sekunde ist weiß ich ned woran das liegt. wenn ned liegt die sekunde an deinem programm
Ach und noch so n nebenbei-tip: Empfang öfter als du sendest, senden alle 0.1 sekunden, empfangen alle 0.05 oder so. is vllt besser weil der sender dann auch immer nen empfänger hat. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.10.2005, 16:58 Titel: |
|
|
Ping-test:
Bytes=32,Zeit<1 ms, TTL=128, das 4 mal
Dürfte also weniger am Ping liegen.
Weiß nicht ob das geht, öfter zu senden als zu empfangen, weil dann versucht der empfänger, mehr zu senden als da ist, ich denke, das hat mal zu diesem recht schweren absturz geführt.
Außerdem liegt daran doch sicher nicht die Verzögerung von 1 Sekunde, oder?
Und jetzt hab ich kein Lag mehr drin...was ist das sonst??? |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.10.2005, 17:21 Titel: |
|
|
jetzt hast du nur noch daten-lag, alles andere kannst du beseitigen.
Wenn du dich zB an dem Text, den marzec gepostet hat orientierst könntest du dein programm jetzt so bauen, dass die Grafik einfach mit den letzten empfangenen daten immer weiter dargestellt wird bis das neueste paket über 3 sekunden alt ist oder so, dann stoppst du erst. Und du überträgst nur zwei oder drei mal pro sekunde neue daten. das spart traffic und somit auch zeit. Dann merkt man im allgemeinen das laggen nicht.
Du kannst halt nicht für jeden Frame die genaue Position jeder Einheit angeben, das geht einfach nicht.
den ping-test solltest du dir übrigens selber bauen
sowas in der richtung:
rechner 1 startet die stoppuhr
rechner 1 sendet: "ping"
rechner 2 empfängt: "ping"
rechner 2 antwortet (sofort): "pong"
rechner 1 empfängt: "pong"
rechner 1 stoppt die uhr.
dann zeit anzeigen.
Dann siehst du, wie die ping mit deinem Programm ist und nicht mit der normalen netzwerk-ping. Deine liegt nämlich garantiert drüber oder was meinst du, warum games wie zB CS auch im privaten LAN mit ner ping unter 1 ms dann im spiel doch 10 bis 30 haben? _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.10.2005, 19:49 Titel: |
|
|
Den Text hatte ich zwar nicht verstanden, aber das was du erläutert hast sagt ja das meißte: einfach 2 Arrays, eins für Anzeigedaten, eins für echte Daten, die echten Daten werden ab und zu aktuallisiert, die Anzeigedaten immer.
Wenn das so ist, war das ganze ne recht sinnlose aktion - dann hatte ich ja davor auch nur das Datenlag... |
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.10.2005, 20:20 Titel: |
|
|
wieso war das sinnlos? Das Datenlag bist du jetzt eigentlich los.. brauchst halt wahrscheinlich noch bisschen erfahrung.
Aber in dem Text stand noch mehr drin. Der Text geht ja davon aus, dass man einen dedicated server hat, der nur server ist und sonst nix zu tun hat, keine grafik, nichts. Der text beschrieb dann für diesen Server dass der einfach immer das aktuellste paket was ihm vorliegt an die weiteren clients zu verteilen (eventuell halt bearbeitet) und das er nicht auf einen Client warten darf. Sonst laggen alle anderen (daten). _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.10.2005, 20:29 Titel: |
|
|
Na ja, weil es davor ja im Heimnetzwerk so gut wie laglos ging, dieser neue Code hat nen riesen Lag...
Jap, hast recht, erfahrung hilft sicher immer.
Ich versuche jetzt mal, es nur alle halbe sekunde zu aktuallisieren und dann die Richtung noch zusätzlich zu übertragen, für die der andere dann den gegner weiterbewegen sieht...mal sehen wie das klappt.
/EDIT: Quatsch, in dem Code sind noch Massenweise Fehler. Z.B. muss da irgendwas mit Sleep in die Threads...hab mal im internationalen Forum gefragt. Aber so genau weiß ich das nicht.
Was muss ich noch verändern? |
|
Nach oben |
|
|
Fausti
Anmeldungsdatum: 31.07.2005 Beiträge: 7
|
Verfasst am: 16.10.2005, 21:45 Titel: |
|
|
Hat jetzt vielleicht nichts mit deinem Problem zu tun, aber wenn du SDL wegen SDL_net in deinem Programm hast, wäre es da nicht besser die Threadfunktionen von SDL zu nutzen?
Ich könnte mir vorstellen, das sich da die aus der FB Runtime mit denen aus der SDL Bibliothek beissen. Nur ne Vermutung. |
|
Nach oben |
|
|
|