 |
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, 09: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: 4702 Wohnort: ~/
|
Verfasst am: 07.06.2007, 10: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, 11: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, 23: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.
|
|