Mit mit BindGadgetEvent habe ich das noch nicht ausprobiert, aber mit BindEvent.
Dazu gibt es EventData(). Diese sind aber nur gültig bei Verwendung eines benutzerdefinierten Ereignisses.
Hier mal ein Beispiel was aber irgendwann zu einen Speicherfehler führen kann
da der Thread eventuell schon beendet ist, bevor die String gelesen wurden.
Code: Alles auswählen
; Alle unsere beutzerdefinierten Ereignisse
Enumeration #PB_Event_FirstCustomValue
#EventBeginProcessing
#EventProcessingFinished
EndEnumeration
Procedure Thread(Value)
Protected data1.s, data2.s
data1.s = "Thread begin processing"
data2.s = "Thread processing finished"
PostEvent(#EventBeginProcessing, 0 ,0, 0, @Data1)
Delay(3000)
PostEvent(#EventProcessingFinished, 0 ,0, 0, @Data2)
Delay(1000)
EndProcedure
Procedure MyBind()
Debug PeekS(EventData())
EndProcedure
OpenWindow(0, 200, 200, 100, 100, "PostEvent")
BindEvent(#EventBeginProcessing, @MyBind())
BindEvent(#EventProcessingFinished, @MyBind())
CreateThread(@Thread(), 0)
Repeat
Event = WaitWindowEvent()
Select Event
; Case #EventBeginProcessing
; Debug "Thread begin processing "
;
; Case #EventProcessingFinished
; Debug "Thread processing finished"
EndSelect
Until Event = #PB_Event_CloseWindow
Dazu habe ich irgendwann mal
SendEvent geschrieben. Dieser warte so lange bis die Nachricht verarbeitet wurde. (DispatchEvent)
Code: Alles auswählen
; ***************************************************************************************
;-TOP
; Comment : SendEvent
; Author : mk-soft
; Version : v1.05
;- Structure
Structure udtSendEvent
Signal.i
Result.i
*pData
EndStructure
; ---------------------------------------------------------------------------------------
Procedure SendEvent(Event, Window = 0, Object = 0, EventType = 0, pData = 0, Semaphore = 0)
Protected MyEvent.udtSendEvent, result
With MyEvent
If Semaphore
\Signal = Semaphore
Else
\Signal = CreateSemaphore()
EndIf
\pData = pData
PostEvent(Event, Window, Object, EventType, @MyEvent)
WaitSemaphore(\Signal)
result = \Result
If Semaphore = 0
FreeSemaphore(\Signal)
EndIf
EndWith
ProcedureReturn result
EndProcedure
; ---------------------------------------------------------------------------------------
Procedure SendEventData(*MyEvent.udtSendEvent)
ProcedureReturn *MyEvent\pData
EndProcedure
; ---------------------------------------------------------------------------------------
Procedure DispatchEvent(*MyEvent.udtSendEvent, result)
*MyEvent\Result = result
SignalSemaphore(*MyEvent\Signal)
EndProcedure
; ***************************************************************************************
;- Test
Enumeration
#Window
EndEnumeration
;- Constants
Enumeration #PB_Event_FirstCustomValue
#My_Event_Question
EndEnumeration
; Thread
Procedure Test(Null)
Protected result
Debug "Init Thread"
Repeat
Delay(500)
result = SendEvent(#My_Event_Question, 0, 0, 0, Random(100))
Select result
Case #PB_MessageRequester_Yes
Debug "Antwort Ja"
Case #PB_MessageRequester_No
Debug "Antwort Nein"
Case #PB_MessageRequester_Cancel
Debug "Antwort Abbrechen"
EndSelect
Until result = #PB_MessageRequester_Cancel
Debug "Exit Thread"
EndProcedure
; BindEvent
Procedure MyEvent()
Protected MyEvent
MyEvent = EventData()
Value = SendEventData(MyEvent)
Debug "Es kommt ein SendEvent: " + Str(Value)
result = MessageRequester("Frage", "Wie soll es weiter gehen?", #PB_MessageRequester_YesNoCancel)
DispatchEvent(MyEvent, result)
EndProcedure
If OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
BindEvent(#My_Event_Question, @MyEvent())
hThread = CreateThread(@Test(), #Null)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
exit = 1
Case #PB_Event_Gadget
EndSelect
Until exit
If IsThread(hThread)
Debug "Thread läuft"
KillThread(hThread)
EndIf
EndIf