Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 18.12.2015, 17:40 Titel: Destructorproblem Programmfehler |
|
|
Ich habe ein kleines Problem mit folgendem Progrämmchen:
https://www.freebasic-portal.de/porticula/threaddestructorproblem-mit-fb1-0432bit-1816.html
Wie sinnvoll das Ganze ist, sei mal dahingestellt. Über einen Thread werden bestimmte Systemereignisse leicht aufbereitet und "zwischengeparkt".
Wichtig war mir hierbei nur die Kombination aus UDT, Methode als Thread, in den Methoden integrierten Mutexes und eventuell mehrere mögliche Instanzen.
Mein System Win8.1 64bit (<-edit)
Compliler Option: -s console
Mit dem 1.04 64bit Compiler wird der Destructor ordnungsgemäß ausgeführt (BEEP)
Mit dem 1.04 32bit hingegen hängt das Programm im Destructor fest ( ThreadWait() ???)
Ist dieses Verhalten anderswo reproduzierbar? Liegts am Code?
Mutton
Zuletzt bearbeitet von Muttonhead am 18.12.2015, 19:30, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 18.12.2015, 18:45 Titel: |
|
|
Ich weiss nicht ob dir das was hilft,aber mit dem FreeBASIC-1.04.0-linux-x86 (32Bit) Compiler ist der Fehler nicht reproduzierbar!
Ich kann auch nicht erkennen wo da der Fehler im Code sein soll. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 18.12.2015, 19:00 Titel: |
|
|
@Elor:
Danke fürs testen. Ich vermute es betrifft nur Windows. mit -s console compilert, freezed das noch offene Konsolenfenster. Bei -s gui beendet sich das Programm scheinbar korrekt, ist jedoch erst über den Taskmanager wirklich zu beenden.
edit: nach weiterem "Entkernen" bin jetzt eher der Meinung daß das Problem mehr bei Inkey und Co. zu suchen ist.
Code: |
'System Includes
#include once "fbgfx.bi"
#include once "vbcompat.bi"
namespace sGUI
type _SystemEvents as SystemEvents
'SystemEvent
dim as _SystemEvents ptr SysEvents
'sGUI Includes
type SystemEvents
SystemEventOccurred as integer
'Keyboard
Key as string
'Maus
MouseMoved as integer
MouseX as integer
MouseY as integer
LMB as integer
MMB as integer
RMB as integer
Wheel as integer
'Screen
CloseButton as integer
'Thread und Mutex
Mutex as any ptr
ThreadEndSignal as integer
TheThread as any ptr
declare constructor
declare destructor
declare static sub WrappedThreadCall(obj as any ptr)
declare sub CollectEvents
declare sub SetThreadEndSignal
end type
constructor SystemEvents
Mutex=mutexcreate
ThreadEndSignal=0
TheThread=ThreadCreate(@WrappedThreadCall,@this)
end constructor
destructor SystemEvents
SetThreadEndSignal
'sleep 100'<--------------------mit gehts besser, aber nicht gut, gelegentlich Absturz beim Beenden
ThreadWait(TheThread)'<--------hängt hier ohne Sleep xxx
beep'<-------------------------Testpiepser um zu sehen wie weit es geht!!!!
mutexdestroy(Mutex)
end destructor
sub SystemEvents.WrappedThreadCall(obj as any ptr)
cast(SystemEvents ptr,obj)->CollectEvents
end sub
sub SystemEvents.CollectEvents
dim as integer exitloop=0
do
sleep 5
MutexLock(Mutex)
exitloop=ThreadEndSignal
MutexUnLock(Mutex)
loop until exitloop
end sub
sub SystemEvents.SetThreadEndSignal
MutexLock(Mutex)
ThreadEndSignal=1
MutexUnLock(Mutex)
end sub
end namespace
'******************************************************************************
'******************************************************************************
'allg. Destruktor**************************************************************
sub Maindestructor destructor
if sGUI.SysEvents then delete sGUI.SysEvents
end sub
'******************************************************************************
'******************************************************************************
'Hauptprogramm*****************************************************************
using sGUI
screen 19,32
SysEvents=new SystemEvents
do
sleep 1
print ".";
loop until inkey<>"" |
Diese Version macht im Threadloop nichts, verhält sich beim Beenden unauffällig
Mutton |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 19.12.2015, 15:42 Titel: |
|
|
Hallo, ich mir mir mal nen alten XP raus geholt und FBC 1.04.0 installiert... gleicher fehler!
Ich traue ja weder den Konstruktoren noch den Destruktoren von FreeBASIC weil fuer mich nicht ganz klar ist, was nach dem Ende des Programms noch gueltig ist und was nicht.
Allso, was ist den innerhalb des Destruktor's noch gueltig?
Ich hab mal den inhalt des Destruktor's ans ende des Programms verlegt, also so:
Code: |
'' ...
'' ...
dim as string key
do
sleep 1
print ".";
key=GetInkey
if key<>"" then print key;
loop until key=chr(27)
SysEvents->SetThreadEndSignal
ThreadWait(SysEvents->TheThread)
'beep'<-------------------------Testpiepser um zu sehen wie weit es geht!!!!
mutexdestroy(SysEvents->Mutex)
|
Und dann Funktionierts! Aber warum? |
|
Nach oben |
|
|
|