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

 
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: 11.11.2005, 22:51    Titel: Multithreading Antworten mit Zitat

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



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 12.11.2005, 00:20    Titel: Antworten mit Zitat

ähmm.....

1. Beutz einfach -s gui und arbeite nur mit dem windows/graphik fenster,
2. Was sollte der code denn produzieren?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.11.2005, 00:25    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 12.11.2005, 01:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.11.2005, 16:29    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 12.11.2005, 17:41    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 12.11.2005, 18:12    Titel: Antworten mit Zitat

Und wie würde das mit der WinAPI gehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 12.11.2005, 18:28    Titel: Antworten mit Zitat

http://forum.qbasic.at/viewtopic.php?t=1677
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
mjs



Anmeldungsdatum: 26.09.2005
Beiträge: 75
Wohnort: Adelheidsdorf

BeitragVerfasst am: 14.11.2005, 10:39    Titel: Re: Multithreading Antworten mit Zitat

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


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 14.11.2005, 17:31    Titel: Antworten mit Zitat

K, funzt jetzt mit so nem komsichen Code den mit Devilkevin über ICQ geschickt hast.
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