 |
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 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 11.11.2005, 22:51 Titel: Multithreading |
|
|
Hallo. Ich habe folgenden Code geschrieben:
Code: | '$INCLUDE: "SDL/SDL.bi"
'$INCLUDE: "SDL/SDL_NET.bi"
DECLARE SUB Connect(socket as tcpsocket,nummer)
DECLARE SUB raushier(param)
TYPE spielereigenschaften
gold AS integer
goldmiene AS integer
krieger AS integer
wall AS integer
END TYPE
DIM spieler(5) AS spielereigenschaften
DIM SHARED AS byte threadcontrol=0
SCREEN 18,8,3,0
thread_raushier = THREADCREATE(@raushier, 0)
COLOR 1,7
CLS
#define delay 0.05
t#=TIMER+delay
DIM sockclient AS tcpsocket
Connect(sockclient,nummer)
IF nummer=1 THEN gegi=2 ELSE gegi=1
spieler(1).goldmiene=1
spieler(2).goldmiene=1
threadcontrol=1
THREADWAIT threadraushier
WHILE e=0
WHILE TIMER<T#
WEND
t#=TIMER+delay
zahler=zahler+1
IF zahler>50 THEN
zahler=0
spieler(nummer).gold=spieler(nummer).gold+spieler(nummer).goldmiene*5
gold=spieler(nummer).gold
gm=spieler(nummer).goldmiene
krieger=spieler(nummer).krieger
wall=spieler(nummer).wall
SDLNET_TCP_SEND(sockclient, @gold,2)
SDLNET_TCP_SEND(sockclient, @gm,2)
SDLNET_TCP_SEND(sockclient, @krieger,2)
SDLNET_TCP_SEND(sockclient, @wall,2)
SDLNET_TCP_RECV(sockclient, @gold,2)
SDLNET_TCP_RECV(sockclient, @gm,2)
SDLNET_TCP_RECV(sockclient, @krieger,2)
SDLNET_TCP_RECV(sockclient, @wall,2)
spieler(gegi).gold=gold
spieler(gegi).goldmiene=gm
spieler(gegi).krieger=krieger
spieler(gegi).wall=wall
END IF
IF MULTIKEY(&H01) THEN e=1
dummy$=INKEY$
SCREENLOCK
CLS
PRINT "Gold(1): "+STR$(spieler(1).gold)
PRINT "Goldmiene(1): "+STR$(spieler(1).goldmiene)+" Kosten einer neuen Miene: "+_
STR$(spieler(1).goldmiene*spieler(1).goldmiene)+" Gold"
PRINT "Krieger(1): "+STR$(spieler(1).krieger)
PRINT "Wall(1): "+STR$(spieler(1).wall)
PRINT "Gold(2): "+STR$(spieler(2).gold)
PRINT "Goldmiene(2): "+STR$(spieler(2).goldmiene)+_
" Kosten einer neuen Miene: " + STR$(spieler(2).goldmiene*spieler(2).goldmiene)+" Gold"
PRINT "Krieger(2): "+STR$(spieler(2).krieger)
PRINT "Wall(2): "+STR$(spieler(2).wall)
IF spieler(nummer).goldmiene*spieler(nummer).goldmiene<spieler(nummer).gold THEN
PRINT "Goldmiene Bauen=1"
END IF
SCREENUNLOCK
WEND
END
SUB raushier(param as integer)
DO
IF MULTIKEY(&H01) THEN END
LOOP WHILE threadcontrol=0
END SUB
SUB Connect(socket as tcpsocket,nummer)
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
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 )
SLEEP 5
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 |
Wieso wird stürzt das Programm ab, wenn man Escape drückt(das WIndowsfenster schließt sich; die Konsole bleibt)?
Was kann man dagegen tun? |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 12.11.2005, 00:20 Titel: |
|
|
ähmm.....
1. Beutz einfach -s gui und arbeite nur mit dem windows/graphik fenster,
2. Was sollte der code denn produzieren? |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.11.2005, 00:25 Titel: |
|
|
Erstmal ist das egal was der produzieren soll, denn bis auf das Beenden klappt ja alles. Und da hab ich halt gedacht, das dann bei diesem Thread halt egal wo das Programm beendet wird, wenn das END im Thread kommt.
Bei -s gui passiert das selbe, das Programm bleibt, auch wenn das Fenster weg ist. |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 12.11.2005, 01:48 Titel: |
|
|
Hm.
Gut Ok, es ist nachts / morgens um halb eins - gääähn.
hab trotzdem mal deinen Programmcode überflogen.
Sorry, hab jetzt aber nicht die Zeit, in die Tiefe zu gehen.
Jedenfalls setz ich voraus (ohne diesen Befehl genau zu kennen)
daß "IF MULTIKEY(&H01)" bedeutet; "Falls Escape gedrückt"
Weiterhin nehm ich an, daß du damit ein Programmende
einleiten lassen willst.
Falls das nicht so ist (&H01 <> Esc), dann sind meine
Vermutungen falsch bis halbrichtig!
In der "IF" Zeile setzt du die Variable "e" auf 1, falls Escape gedrückt war
Und die "Programmschleife" heißt: WHILE e=0 .... WEND
Das führt dazu, daß nach Escape e auf 1 gesetzt wird und die
While-Wendschleife verlassten wird.
Nach dieser Wendschleife hast du den Befehl "END" stehen.
und der stoppt / endet das Programm (ohne die Fenster zu schließen?).
Eigentlich solltest du anstelle END den Befehl SYSTEM nehmen,
dann wird alles beendet UND GESCHLOSSEN.
Hoffentlich hilft dir dieser Tip
Tschö, euer Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 12.11.2005, 16:29 Titel: |
|
|
Ich hab das gerade eben probiert, indem ich sowohl im Eigentlichen Threadsub als auch im Programm END durch System ersetzt habe. Leider schließt jetzt nach wie vor das Fenster, und die Konsole reagiert nicht mehr. Das war also nicht der Fehler..
Ach ja, es ging um den Sub, der möglich machen soll(dadurch, das er stets im Hintergrund läuft), das das Programm jederzeit mit Escape beendbar sein soll:
Code: | SUB raushier(param as integer)
DO
IF MULTIKEY(&H01) THEN SYSTEM
SLEEP 20
LOOP WHILE threadcontrol=0
END SUB |
|
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.11.2005, 17:41 Titel: |
|
|
das geht nicht, in der Referenz steht drin, du musst alle Threads beenden bevor du dein Programm beenden kannst. Du musst also in dem Thread irgendwie den Prozesshandle von deinem Programm raussuchen und dann gewaltsam beenden, mit system geht das nicht weil die anderen Threads noch laufen. Einen Thread beendest du, indem du die Sub beendest. Entweder du beendest erst alle threads und dann das programm oder du tötest den Prozess per winapi gewaltsam ab.[/u] _________________ "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.11.2005, 18:12 Titel: |
|
|
Und wie würde das mit der WinAPI gehen? |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
mjs
Anmeldungsdatum: 26.09.2005 Beiträge: 75 Wohnort: Adelheidsdorf
|
Verfasst am: 14.11.2005, 10:39 Titel: Re: Multithreading |
|
|
Progger_X hat Folgendes geschrieben: | Wieso wird stürzt das Programm ab, wenn man Escape drückt(das WIndowsfenster schließt sich; die Konsole bleibt)?
Was kann man dagegen tun? |
Da war ein Fehler, der in der letzten Testing-Version behoben wurde und direkt mit dem Beenden des Programms (während der Grafik-Modus aktiv war) zusammen hing.
Als Work-Around kannst du ja vor dem Beenden ein "SCREEN 0" versuchen. Das könnte den Absturz ggf. Beheben.
Gruß,
Mark |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 14.11.2005, 17:31 Titel: |
|
|
K, funzt jetzt mit so nem komsichen Code den mit Devilkevin über ICQ geschickt hast. |
|
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.
|
|