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:

Methode eines UDT als Thread starten

 
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: 565
Wohnort: Jüterbog

BeitragVerfasst am: 04.01.2014, 18:45    Titel: Methode eines UDT als Thread starten Antworten mit Zitat

Wie schon der Titel sagt/fragt:

Ist so etwas möglich? Dreaels kleine Thread-Beispiele hab mich jetzt ein wenig angestachelt. grinsen
Aber ich hänge hier grad eine wenig...

Code:
type KeyListEntry
  nextkey as KeyListEntry ptr
  key as string
  termination as double
end type

declare sub eventtrapping'<---- auskommentieren


type sGUIHandle
  private:
  KeyEventAccess  as any ptr
  RAWKEY          as string
  KEY             as string
  ASCCODE         as integer
  EXTENDED        as integer

  oldestKeyListEntry as KeyListEntry ptr
  latestKeyListEntry as KeyListEntry ptr

  EndSignalAccess as any ptr
  Endsignal as integer

  EventTrappingHandle as any ptr

  public:
  declare constructor()
  declare destructor()
  declare function xInkey as string

  private:
  declare sub EventTrapping'<---- auskommentieren oder halt nicht
end type

constructor sGUIHandle
  KeyEventAccess=mutexcreate
  EndSignalAccess=mutexcreate
'  EventTrappingHandle=threadcreate (cast(any ptr,@EventTrapping))'<----?????????
  EventTrappingHandle=threadcreate (cast(any ptr,this.EventTrapping))'<----?????????
end constructor


destructor sGUIHandle
  threadwait EventTrappingHandle
  mutexdestroy KeyEventAccess
  mutexdestroy EndSignalAccess
end destructor


sub sGUIHandle.EventTrapping'als Methode von sGUIHandle Fehlermeldung
end sub


dim keyevent as sGUIHandle ptr
keyevent=new sGUIHandle
dim key as string

do
  sleep 1
  key=keyevent->xINKEY
  if key<>"" then print key
loop until key="q"

delete keyevent
end


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.01.2014, 18:49    Titel: Antworten mit Zitat

Typischerweise verwendet man für sowas eine statische Wrapper-Funktion, die beim Starten des Threads eine "that"-Variable auf das eigentliche Objekt bekomment und dann that->MemberFunktion() aufruft.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 04.01.2014, 21:06    Titel: Antworten mit Zitat

Deine EventTrapping Sub muss 'Static' deklariert werden. Es könnte in etwa so aussehen:
Code:

Type KeyListEntry
  nextkey As KeyListEntry Ptr
  key As String
  termination As Double
End Type

Type sGUIHandle
  Private:
  KeyEventAccess  As Any Ptr
  RAWKEY          As String
  KEY             As String
  ASCCODE         As Integer
  EXTENDED        As Integer
 
  oldestKeyListEntry As KeyListEntry Ptr
  latestKeyListEntry As KeyListEntry Ptr
 
  EndSignalAccess As Any Ptr
  Endsignal As Integer
 
  EventTrappingHandle As Any Ptr
 
  Public:
  Declare Constructor ()
  Declare Destructor ()
  Declare Function xInkey As String
 
  Private:
  Declare Static Sub EventTrapping (foo As Any Ptr)
End Type

Constructor sGUIHandle ()
  KeyEventAccess = MutexCreate
  EndSignalAccess = MutexCreate
  EventTrappingHandle = ThreadCreate(@sGUIHandle.EventTrapping)
End Constructor

Destructor sGUIHandle ()
  ThreadWait EventTrappingHandle
  MutexDestroy KeyEventAccess
  MutexDestroy EndSignalAccess
End Destructor

Function sGUIHandle.xInkey As String
  Return InKey
End Function

Sub sGUIHandle.EventTrapping (foo As Any Ptr)
  Print "Event"
End Sub

Dim As sGUIHandle Ptr keyevent = New sGUIHandle
Dim As String key

Do
  Sleep 1
  key = keyevent->xInkey()
  If key <> "" Then
     Print key
  EndIf
Loop Until key = "q"

Delete keyevent
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



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

BeitragVerfasst am: 05.01.2014, 11:21    Titel: Antworten mit Zitat

@ Jojo/MOD

vielen Dank, sogar das "wrappen" hat geklappt.
In diesem Fall wäre es egal, es wäre ja eh nur eine Instanz die laufen darf, aber halt nur mal so als Test, wie es gehen könnte.

Obwohl mir noch nicht so ganz klar ist, was ich da als Parameter übertrage: Wert oder Referenz auf den Wert (der ja eigentlich selbst wiederum ne Adresse ist) ... falls jemand versteht, was ich meine.
Hab jetzt hier ne Weile mit den Operatoren * und @ und cast
herumgespielt...


Code:
type KeyListEntry
  nextkey as KeyListEntry ptr
  key as string
  termination as double
end type

type _sGUIHandle as sGUIHandle

type sGUIHandle
  private:
  KeyEventAccess  as any ptr
  RAWKEY          as string
  KEY             as string
  ASCCODE         as integer
  EXTENDED        as integer

  oldestKeyListEntry as KeyListEntry ptr
  latestKeyListEntry as KeyListEntry ptr

  EndSignalAccess as any ptr
  Endsignal as integer

  EventTrappingHandle as any ptr
  that                as sGUIHandle ptr

  public:
  declare constructor()
  declare destructor()
  declare function xInkey as string

  declare static sub EventTrappingCall (obj as any ptr)
  declare sub EventTrapping
end type

constructor sGUIHandle
  KeyEventAccess=mutexcreate
  EndSignalAccess=mutexcreate
  that=@this
  EventTrappingHandle=threadcreate (cast(any ptr,@EventTrappingCall), that )
end constructor


destructor sGUIHandle
  threadwait EventTrappingHandle
  mutexdestroy KeyEventAccess
  mutexdestroy EndSignalAccess
end destructor


sub sGUIHandle.EventTrappingCall (obj as any ptr)
  cast(sGUIHandle ptr  ,   obj  )->EventTrapping
end sub


sub sGUIHandle.EventTrapping
  Print ":)"
end sub


Function sGUIHandle.xInkey As String
  Return InKey
End Function


'******************************************************************************


dim keyevent as sGUIHandle ptr
keyevent=new sGUIHandle
dim key as string

do
  sleep 1
  key=keyevent->xINKEY
  if key<>"" then print key
loop until key="q"

delete keyevent
end


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 05.01.2014, 13:55    Titel: Antworten mit Zitat

Warum nicht einfach so:
Code:
EventTrappingHandle=ThreadCreate( @EventTrappingCall, @This )

Dieses Cast braucht man nur, wenn die aufzurufende Sub keinen Any Ptr Parameter hat (was sie aber haben muss).
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