MessageRequester aus Thread aufrufen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

MessageRequester aus Thread aufrufen

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive