Seite 1 von 1

SendEvent Include (ab PB v5.10)

Verfasst: 28.12.2012 16:50
von mk-soft
Manchmal braucht man eine Anwort von User wie es in einen Thread weitergehen soll.
Dafür habe ich aus den PostEvent ein SendEvent erstellt.

Update v1.05
- Optionaler Parameter für externen Semaphore für bessere Performans

Update v1.04
- Beispiel überarbeitet

Update v1.03
- #PB_Event_FirstCustomValue

Update v1.02
- Eigenen EventType übergeben

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

; ***************************************************************************************

Enumeration
   #Window
EndEnumeration

;- Test

;- Constants
Enumeration #PB_Event_FirstCustomValue
  #My_Event_Question
EndEnumeration

Procedure Test(Null)
 
  Protected result
  
  Debug "Init Thread"
  MySemaphore = CreateSemaphore()
  
  Repeat
    Delay(500)
    result = SendEvent(#My_Event_Question, 0, 0, 0, Random(100), MySemaphore)
    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
  
  If MySemaphore
    FreeSemaphore(MySemaphore)
  EndIf
  
  Debug "Exit Thread"
  
EndProcedure

Global MyEvent

If OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 
  hThread = CreateThread(@Test(), #Null)
 
  Repeat
     
    Select WaitWindowEvent()
           
        Case #PB_Event_CloseWindow
           exit = 1
           
        Case #PB_Event_Gadget
         
        Case #My_Event_Question
           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)
       
     EndSelect
     
   Until exit
   If IsThread(hThread)
     Debug "Thread läuft"
     KillThread(hThread)
   EndIf
   
 EndIf
FF :wink:

Re: Aus PostEvent ein SendEvent

Verfasst: 28.12.2012 17:00
von STARGÅTE
Wird sicherlich funktionieren ^^, allerdings sollten wir noch warten bis die nächte Beta kommt, denn aktuell erzeugt PostEvent() ein "procedure stack has been currupted" (unter x86).

Re: Aus PostEvent ein SendEvent

Verfasst: 28.12.2012 17:02
von mk-soft
Ich warte auch schon auf die nächste Beta :allright:

Re: Aus PostEvent ein SendEvent

Verfasst: 29.12.2012 00:32
von mk-soft
Läuft ab PB v5.10 Beta 2 :allright:

Re: SendEvent Include (ab PB v5.10)

Verfasst: 23.01.2013 11:57
von mk-soft
Update v1.05
- Optionaler Parameter für externen Semaphore für bessere Performans

FF :wink: