Seite 1 von 1

MessageRequester aus Thread aufrufen

Verfasst: 16.03.2018 14:27
von mk-soft
Bevor ich es wegwerfe...
Im Modul ThreadToGUI vorhanden

Code: Alles auswählen

;-TOP
;
; MessageRequester aus Thread aufrufen
; mk-soft, v1.02, 16.03.2018

; -----------------------------------------------------------------------------

CompilerIf #PB_Compiler_Thread = 0
  CompilerError "Option Threadsafe aktivieren"
CompilerEndIf

Enumeration EventCustomValue #PB_Event_FirstCustomValue
  ; Nothing
EndEnumeration
  
Enumeration EventCustomValue
  #MyEvent_MessageRequester
EndEnumeration

Structure udtMessageRequester
  Signal.i
  Result.i
  Title.s
  Text.s
  Flags.i
EndStructure

Global LockMessageRequester = CreateMutex()

Procedure thMessageRequester(Title.s, Text.s, Flags=0)
  Protected *data.udtMessageRequester, result.i
  With *data
    *data = AllocateStructure(udtMessageRequester)
    If *data
      \Signal = CreateSemaphore()
      \Title = Title
      \Text = Text
      \Flags = Flags
      LockMutex(LockMessageRequester)
      PostEvent(#MyEvent_MessageRequester, 0, 0, 0, *data)
      WaitSemaphore(\Signal)
      UnlockMutex(LockMessageRequester)
      FreeSemaphore(\Signal)
      result = \Result
      FreeStructure(*data)
      ProcedureReturn result
    Else
      ProcedureReturn -1 ; Out Of Memory
    EndIf
  EndWith
EndProcedure

Procedure DispatchMessageRequester()
  Protected *data.udtMessageRequester
  With *data
    *data = EventData()
    If *data
      \Result = MessageRequester(\Title, \Text, \Flags)
      SignalSemaphore(\Signal)
    EndIf
  EndWith
EndProcedure

BindEvent(#MyEvent_MessageRequester, @DispatchMessageRequester())

; -----------------------------------------------------------------------------

CompilerIf #PB_Compiler_IsMainFile
  
  Procedure thMessage(Nummer)
    Protected r1
    Repeat
      Delay(1000)
      r1 = thMessageRequester("Frage", "Thread Nummer " + Nummer +  " beenden?", #PB_MessageRequester_YesNo | #PB_MessageRequester_Info)
    Until r1 = #PB_MessageRequester_Yes
  EndProcedure
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 80, "Thread Test")
    CreateThread(@thMessage(), 1)
    CreateThread(@thMessage(), 2)
    CreateThread(@thMessage(), 3)
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
      EndSelect
    ForEver
  EndIf
  
CompilerEndIf