@All
Hilfe... Warten wir auf den Threadersteller wo das Problem wirklich ist. Vielleicht is es wirklich ein Bug.
@Schleicher
Diese Verarbeitung in einen Thread auslagern und mit PostEvent mit der GUI kommunizieren
oder mit SendEvent...
http://www.purebasic.fr/german/viewtopi ... =Sendevent
http://www.purebasic.fr/german/viewtopi ... =Sendevent
Es sollte immer nur ein (Wait)WindowEvent() geben. Es gibt nur sehr selten ausnahmen.
Zum Beispiel verwende ich mir einen eigenen WWE alle Events bei der Anzeige von Lizenz-Info.
P.S.
Beispiel mit PostEvent und EventData. Dabei wird für jedes Event für die Daten ein Speicher angefordert und nach Verarbeitung wieder freigegeben.
Somit wird ein Datenverlust auch bei blockierten GUI (Menu aktiv, Resize) vermieden.
Funktioniert somit auch sauber unter Linux und Mac
Code: Alles auswählen
;-TOP
; Basis
; Konstanten
Enumeration ;Window
#Main
EndEnumeration
Enumeration ; Menu
#Menu
EndEnumeration
Enumeration ; MenuItems
#MenuExit
EndEnumeration
Enumeration ; Gadgets
#List
#Edit
EndEnumeration
Enumeration ; Statusbar
#Status
EndEnumeration
; Global Variable
Global exit
; Functions
Procedure UpdateWindow()
Protected x, y, dx, dy, menu, status
menu = MenuHeight()
If IsStatusBar(#Status)
status = StatusBarHeight(#Status)
Else
status = 0
EndIf
x = 0
y = 0
dx = WindowWidth(#Main)
dy = WindowHeight(#Main) - menu - status
ResizeGadget(#List, x, y, dx, dy)
EndProcedure
;-
Enumeration #PB_Event_FirstCustomValue
#My_Event_Data
EndEnumeration
Structure udtData
value.i
text.s
EndStructure
Procedure Send(id)
Protected value, *mem.udtData
Repeat
Repeat
*mem = AllocateStructure(udtData)
If *mem = 0 ; Zur Zeit kein Speicher verfügbar
Delay(1000)
EndIf
Until *mem
*mem\value = value
*mem\text = "Value " + value
PostEvent(#My_Event_Data, 0, 0, 0, *mem)
value + 1
Delay(1000)
Until exit
EndProcedure
Procedure Receive()
Protected *mem.udtData
*mem = EventData()
Debug *mem\value
AddGadgetItem(#List, -1, *mem\text)
FreeStructure(*mem)
EndProcedure
; Main
Procedure Main()
Protected event, style, dx, dy
style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
dx = 800
dy = 600
If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, dx, dy, "Main", style)
; Enable Fullscreen
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
Protected NewCollectionBehaviour
NewCollectionBehaviour = CocoaMessage(0, WindowID(#Main), "collectionBehavior") | $80
CocoaMessage(0, WindowID(#Main), "setCollectionBehavior:", NewCollectionBehaviour)
CompilerEndIf
; Menu
CreateMenu(#Menu, WindowID(#Main))
MenuTitle("Ablage")
MenuItem(#MenuExit, "Be&enden")
; Gadgets
ListViewGadget(#List, 0, 0, dx, dy)
; Statusbar
CreateStatusBar(#Status, WindowID(#Main))
AddStatusBarField(#PB_Ignore)
UpdateWindow()
; Init
BindEvent(#My_Event_Data, @Receive())
CreateThread(@Send(), 0)
; Main Loop
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
Case #PB_Menu_About
Case #PB_Menu_Preferences
Case #PB_Menu_Quit
exit = #True
CompilerEndIf
Case #MenuExit
exit = #True
EndSelect
Case #PB_Event_SizeWindow
Select EventWindow()
Case #Main
UpdateWindow()
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Main
exit = #True
EndSelect
EndSelect
Until exit
EndIf
EndProcedure : Main()
End