  | 
					
						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 | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 07.06.2007, 08:47    Titel: Constructor/Destructor and Threadcreate/Threadwait | 
				     | 
			 
			
				
  | 
			 
			
				Hab da ma wieder ein kleines Problem   
 
 
ich wollte eine kleine funktion basteln mit einem Errorhandle als extra Thread, so das wenn also ein fehler auftritt das alles in einer extra Sub ganz automatisch aufgerufen wird... jetzt hab ich mir noch gedacht, ich spar mir extra funktionen zum Errorhandle initialisieren und beenden ect und starte es direkt mit contruktor... leider hab ich dabei nicht beachtet das alle variablen die ich dafür benötige noch gar nicht definiert sind da die mit constructor gestartete Sub vor allem anderen ausgeführt wird und so erliegt der test einem stillstand....
 
 
Beispiel:
 
 	  | Code: | 	 		  
 
Declare SUB EPF_Error_Handle (null AS INTEGER)
 
Declare Sub Init_test ()
 
 
Const EPF_VERSION = 1.00
 
Dim Shared EPF_Err as Integer = 0
 
Dim Shared EPF_null as Integer
 
 
Sub EPF_Init Constructor
 
    EPF_null = THREADCREATE(@EPF_Error_Handle, 0)
 
End SuB
 
 
Sub EPF_end destructor
 
    THREADWAIT (EPF_null)
 
End SuB
 
 
SUB EPF_Error_Handle (null AS INTEGER)
 
   
 
   DO
 
    If EPF_Err<>0 Then
 
        screenres 320,100
 
        
 
        windowtitle "Error "+str(EPF_Err)
 
 
        print "Fehler..:"
 
        
 
        Exit Do
 
    End If
 
    
 
   LOOP
 
   
 
   Sleep
 
   End
 
END SUB
 
 
Sub Init_test ()
 
    dim depth as integer
 
    dim driver as string
 
    SCREENINFO ,,depth,,,,driver
 
    if len(driver)=0 Then EPF_Err=1
 
End Sub
 
 
init_test
 
 
end
 
 | 	  
 
 
weiss vielleicht jemand wie man dieses problem umgehen kann ?! _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 07.06.2007, 09:02    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich habe mich an Con- und Destructor noch nie probiert, aber vielleicht kannst du dir den Constructor ja sparen und das, was er tut, ins Hauptprogramm schreiben? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 07.06.2007, 10:01    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das wiederspricht ja den Sinn des Constructor/Destructor versuchs...
 
 
 	  | Code: | 	 		  
 
Declare SUB EPF_Error_Handle (null AS INTEGER)
 
 
 
 
'------------------------------------------------------------------'
 
Declare Function Data_Pool (Byval Get_Set_Option as Integer, Byval DataSet as Integer, _
 
                            Byval Information as Integer =0) as Integer
 
 
 
 
 
Function Data_Pool (Byval Get_Set_Option as Integer, Byval DataSet as Integer, _
 
                    Byval Information as Integer =0) as Integer
 
                                    'DataSet 
 
    Static Thread_Holder as Integer '0
 
    Static Error_Holder as Integer  '1
 
    
 
    Select Case Get_Set_Option
 
        Case 0                      'Get
 
            
 
            Select Case DataSet
 
                Case 0
 
                    Return Thread_Holder
 
                Case 1
 
                    Return Error_Holder
 
            End Select
 
            
 
        Case 1                      'Set
 
            
 
            Select Case DataSet
 
                Case 0
 
                    Thread_Holder = Information
 
                Case 1
 
                    Error_Holder = Information
 
            End Select
 
            Return 0
 
    
 
    End Select
 
 
End Function
 
 
 
 
'------------------------------------------------------------------'                
 
Declare Sub Set_Err (Byval Error_Code as Integer)
 
 
Sub Set_Err (Byval Error_Code as Integer)
 
    Data_Pool (1,1,Error_Code)
 
    sleep 2
 
End Sub
 
 
 
 
'------------------------------------------------------------------'
 
Declare Function Get_Err as Integer
 
 
Function Get_Err as Integer
 
    Return Data_Pool (0,1)
 
End Function
 
 
 
 
 
 
 
 
SUB EPF_Error_Handle (null AS INTEGER)
 
   ?"Thread Started"
 
   DO
 
        
 
        If get_err > 0 Then
 
            ?"Error",get_err
 
            
 
            
 
            screenres 320,100
 
        
 
            windowtitle "Error "+str(get_err)
 
 
            print "Fehler..:"
 
            
 
            getkey
 
            
 
            Exit Sub
 
            
 
        End If
 
    ?"."; 
 
    LOOP until get_err = -1
 
            
 
            ?"Terminated"
 
            getkey
 
            Exit Sub
 
END SUB
 
 
 
Sub Init_test ()
 
    dim depth as integer
 
    dim driver as string
 
    SCREENINFO ,,depth,,,,driver
 
    If len(driver)=0 Then Set_Err (1)
 
End Sub
 
 
init_test   
 
 
sleep:end
 
 
 
Sub EPF_Start Constructor
 
    Dim TH as Integer
 
    TH=ThreadCreate (@EPF_Error_Handle,0)
 
    Data_Pool (1,0,TH)
 
End Sub
 
 
Sub EPF_End Destructor
 
    Set_Err (-1)
 
    ThreadWait (Data_Pool(0,0))
 
End Sub
 
 | 	  
 
 
Hab es noch etwas weiter versucht, jetzt stürzt es allerdings gleich ab.... _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 09.06.2007, 22:25    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Für Globale Variablen gibts bei CTor/DTor nen ganz einfachen Trick:
 
Während DIM SHARED-Vars erst nach dem CTor initialisiert werden, haben COMMON SHAREDs höhere Priorität.
 
 
So just change DIM SHARED into COMMON SHARED!
 
 
Sollte funzen.
 
Achtung, bei der Verwendung von Arrays: Common unterstützt keine Dimensionierung von Arrays! Das einzige das du machen kannst:
 
 
 	  | Code: | 	 		  COMMON SHARED AS INTEGER Array()
 
 
SUB Init CONSTRUCTOR
 
   Redim As Integer Array(5, 2 To 7)
 
END SUB | 	  
 
 
Viel Spaß damit!
 
 
 
Have a nice day
 
Cia
 
Dusky_Joe _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| 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.
  | 
   
 
     |