Eventschleife nicht anhalten bei Menüklick
Eventschleife nicht anhalten bei Menüklick
Hallo Leute,
dann hab ich noch ne Frage.
Wenn ich im Main Thread sprich im Hauptprogramm bin und aktiv in diesem eine Uhr laufen lassen will, habe ich das Problem,
dass immer wenn ich in der Menüleiste etwas selektiere, die Hauptschleife stehen bleibt (Sehe ich dann ja an der Uhr).
Ein Thread darf aber nicht auf die GUI zugreifen.
Wie macht ihr das, dass das Hauptprogramm weitergeht, auch wenn im Menü oben was selektiert wird.
Gruß Thomas
__________________________________________________
Titel angepasst
24.05.2013
RSBasic
dann hab ich noch ne Frage.
Wenn ich im Main Thread sprich im Hauptprogramm bin und aktiv in diesem eine Uhr laufen lassen will, habe ich das Problem,
dass immer wenn ich in der Menüleiste etwas selektiere, die Hauptschleife stehen bleibt (Sehe ich dann ja an der Uhr).
Ein Thread darf aber nicht auf die GUI zugreifen.
Wie macht ihr das, dass das Hauptprogramm weitergeht, auch wenn im Menü oben was selektiert wird.
Gruß Thomas
__________________________________________________
Titel angepasst
24.05.2013
RSBasic
Re: Noch ne Frage
Vielleicht hilft Dir AddwindowTimer() weiter ?
Und Eventuell das WaitWindowEvent() mit einem Timeout versehen... z.B. WaitWindowEvent(25) oder so....
Und Eventuell das WaitWindowEvent() mit einem Timeout versehen... z.B. WaitWindowEvent(25) oder so....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Noch ne Frage
bei verschieben des Fensters oder bei Menü beibt die Eventscheife immer stehn.
Allerdings verstehe ich nicht, wieso du nicht mit einem Thread auf die GUI zugreifen sollst?
Funktioniert wunderbar.
Allerdings verstehe ich nicht, wieso du nicht mit einem Thread auf die GUI zugreifen sollst?
Code: Alles auswählen
Enumeration
#Window
#Gadget
EndEnumeration
Procedure Timer(Offset)
Repeat
Delay(30)
SetGadgetText(#Gadget, FormatDate("%hh : %ii : %ss , "+Str(((ElapsedMilliseconds()-Offset)%1000)/100), Date()))
ForEver
EndProcedure
OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
TextGadget(#Gadget, 50, 50, 300, 50, "")
Last = Date()
While Date() = Last : Delay(1) : Wend
CreateThread(@Timer(), ElapsedMilliseconds())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
ForEverPB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Noch ne Frage
HalloBisonte hat geschrieben:Vielleicht hilft Dir AddwindowTimer() weiter ?
Und Eventuell das WaitWindowEvent() mit einem Timeout versehen... z.B. WaitWindowEvent(25) oder so....
das bringt nichts.... Ich will ja keinen WaitWindowEvent machen..... Der hält ja selbst an ......
Beispiel:
Code: Alles auswählen
EnableExplicit
If OpenWindow(0,100,20,400,400,"Test",#PB_Window_SystemMenu)
If CreateMenu(0,WindowID(0))
If CreateMenu(0, WindowID(0)) ; hier beginnt das Erstellen des Menüs...
MenuTitle("Project")
MenuItem(1, "Open")
MenuBar() ; hier wird der Abgrenzungsbalken eingefügt
MenuItem(4, "Close")
EndIf
If TextGadget(0,100,100,100,20,"")
Repeat
SetGadgetText(0,FormatDate("%hh:%ii:%SS",Date()))
Delay(100)
Until WindowEvent() = #PB_Event_CloseWindow
EndIf
EndIf
EndIf
End Die Uhr bleibt stehen .....
Das mein ich
Gruß Thomas
Re: Noch ne Frage
STARGÅTE hat geschrieben:bei verschieben des Fensters oder bei Menü beibt die Eventscheife immer stehn.
Allerdings verstehe ich nicht, wieso du nicht mit einem Thread auf die GUI zugreifen sollst?Funktioniert wunderbar.Code: Alles auswählen
Enumeration #Window #Gadget EndEnumeration Procedure Timer(Offset) Repeat Delay(30) SetGadgetText(#Gadget, FormatDate("%hh : %ii : %ss , "+Str(((ElapsedMilliseconds()-Offset)%1000)/100), Date())) ForEver EndProcedure OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) TextGadget(#Gadget, 50, 50, 300, 50, "") Last = Date() While Date() = Last : Delay(1) : Wend CreateThread(@Timer(), ElapsedMilliseconds()) Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow End Case #PB_Event_Gadget Select EventGadget() EndSelect EndSelect ForEver
Ja Stimmt eine Weile .....
Wenn man das in einen Statusbar hängt und die Hauptschleife etwas länger dauert knallt es.....
Siehe auch
http://forums.purebasic.com/german/view ... b00c7e1309
Gruß Thomas
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Eventschleife nicht anhalten bei Menüklick
Dieses 'Delay(100)' ist auch nicht gerade die schlauste Wahl in einer Event-Schleife. Dadurch wird 'WindowEvent()' viel zu selten aufgerufen. Denn sogar das Bewegen der Maus auf dem Fenster feuert jede Menge Events, die erst mit dem Aufruf von '(Wait)WindowEvent()' abgearbeitet werden.
Re: Noch ne Frage
Auch das muss ich wieder verneinen:Joshua314 hat geschrieben:Ja Stimmt eine Weile .....
Wenn man das in einen Statusbar hängt und die Hauptschleife etwas länger dauert knallt es.....
Auch dieser Code funktioniert ohne Probleme.
Code: Alles auswählen
Enumeration
#Window
#Gadget
#Menu
#StatusBar
EndEnumeration
Procedure Timer(Offset)
Last = Date()
While Date() = Last : Delay(1) : Wend
Offset = ElapsedMilliseconds()
Repeat
Delay(30)
StatusBarText(#StatusBar, 0, FormatDate("%hh : %ii : %ss , "+Str(((ElapsedMilliseconds()-Offset)%1000)/100), Date()), #PB_StatusBar_Center)
ForEver
EndProcedure
OpenWindow(#Window, 0, 0, 400, 100, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
TextGadget(#Gadget, 50, 50, 300, 50, "")
CreateMenu(#Menu, WindowID(#Window)) ; hier beginnt das Erstellen des Menüs...
MenuTitle("Project")
MenuItem(1, "Open")
MenuItem(4, "Close")
CreateStatusBar(#StatusBar, WindowID(#Window))
AddStatusBarField(#PB_Ignore)
CreateThread(@Timer(), #Null)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
ForEver
Gründe können sein:
- ThreadSafe vergessen zu aktivieren?
- bei Zugriffen von mehreren Seiten Mutex vergessen?
- Purifier nmicht aktiviert? Vielleicht führst du illegale Schreibbefehle aus.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Eventschleife nicht anhalten bei Menüklick
HiNicTheQuick hat geschrieben:Dieses 'Delay(100)' ist auch nicht gerade die schlauste Wahl in einer Event-Schleife. Dadurch wird 'WindowEvent()' viel zu selten aufgerufen. Denn sogar das Bewegen der Maus auf dem Fenster feuert jede Menge Events, die erst mit dem Aufruf von '(Wait)WindowEvent()' abgearbeitet werden.
ja Stimmt ist nicht das beste .....
War ja hier nur eine Demo zudem was ich meinte
Dennoch hab ich Probleme, dass mir das PRG abschmiert.....
Nur ich hab Klicktel mit 1,8GB hier drauf um am dem Programm zu arbieten
ich kann das bei euch auf dem rechner nicht so einfach nachbilden ....
Gruß Thomas