  | 
					
						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, 21: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: 11.11.2005, 23: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: 11.11.2005, 23: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: 24.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
  | 
		
			
				 Verfasst am: 12.11.2005, 00: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, 15: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, 16: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, 17: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, 09: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, 16: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.
  | 
   
 
     |