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:

Constructor/Destructor and Threadcreate/Threadwait

 
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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.06.2007, 09:47    Titel: Constructor/Destructor and Threadcreate/Threadwait Antworten mit Zitat

Hab da ma wieder ein kleines Problem grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 07.06.2007, 10:02    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.06.2007, 11:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 09.06.2007, 23:25    Titel: Antworten mit Zitat

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
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