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:

Multithreading Netzwerk

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 10.10.2005, 17:30    Titel: Multithreading Netzwerk Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 10.10.2005, 18:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 10.10.2005, 18:22    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 985
Wohnort: Niederbayern

BeitragVerfasst am: 10.10.2005, 21:05    Titel: Antworten mit Zitat

in der Befehlsreferenz steht dazu auch einiges. Unter anderem, dass du mit der Reihenfolge der Locks und Unlocks Obacht geben solltest zwinkern
_________________
» Yodl.de: So sucht man gestern. verwundert
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 10.10.2005, 21:06    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 10.10.2005, 21:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 11.10.2005, 16:47    Titel: Antworten mit Zitat

Ok.

Code:
CALL senden(1)


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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 11.10.2005, 17:28    Titel: Antworten mit Zitat

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 zwinkern
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 11.10.2005, 19:04    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 11.10.2005, 20:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 11.10.2005, 21:02    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 11.10.2005, 21:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.10.2005, 16:02    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.10.2005, 16:27    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.10.2005, 16:58    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.10.2005, 17:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.10.2005, 19:49    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.10.2005, 20:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.10.2005, 20:29    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 31.07.2005
Beiträge: 7

BeitragVerfasst am: 16.10.2005, 21:45    Titel: Antworten mit Zitat

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
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 -> Allgemeine Fragen zu FreeBASIC. 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