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