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:

Destructorproblem Programmfehler

 
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
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 18.12.2015, 17:40    Titel: Destructorproblem Programmfehler Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 18.12.2015, 18:45    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 18.12.2015, 19:00    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 19.12.2015, 15:42    Titel: Antworten mit Zitat

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