Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 04.01.2014, 18:45 Titel: Methode eines UDT als Thread starten |
|
|
Wie schon der Titel sagt/fragt:
Ist so etwas möglich? Dreaels kleine Thread-Beispiele hab mich jetzt ein wenig angestachelt.
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.01.2014, 18:49 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.01.2014, 21:06 Titel: |
|
|
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 |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 05.01.2014, 11:21 Titel: |
|
|
@ 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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 05.01.2014, 13:55 Titel: |
|
|
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 |
|
 |
|