| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Muttonhead 
 
  
 Anmeldungsdatum: 26.08.2008
 Beiträge: 570
 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: 570
 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 |  | 
	
		|  | 
	
		|  |