Seite 1 von 1
Eventschleife nicht anhalten bei Menüklick
Verfasst: 24.05.2013 00:59
von Joshua314
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
Re: Noch ne Frage
Verfasst: 24.05.2013 01:07
von Bisonte
Vielleicht hilft Dir AddwindowTimer() weiter ?
Und Eventuell das WaitWindowEvent() mit einem Timeout versehen... z.B. WaitWindowEvent(25) oder so....
Re: Noch ne Frage
Verfasst: 24.05.2013 01:29
von STARGÅTE
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?
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
Funktioniert wunderbar.
Re: Noch ne Frage
Verfasst: 24.05.2013 11:19
von Joshua314
Bisonte hat geschrieben:Vielleicht hilft Dir AddwindowTimer() weiter ?
Und Eventuell das WaitWindowEvent() mit einem Timeout versehen... z.B. WaitWindowEvent(25) oder so....
Hallo
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
Starte das Programm und Klicke das Menu Project an.
Die Uhr bleibt stehen .....
Das mein ich
Gruß Thomas
Re: Noch ne Frage
Verfasst: 24.05.2013 11:23
von Joshua314
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?
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
Funktioniert wunderbar.
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
Re: Eventschleife nicht anhalten bei Menüklick
Verfasst: 24.05.2013 12:29
von NicTheQuick
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
Verfasst: 24.05.2013 13:21
von STARGÅTE
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 das muss ich wieder verneinen:
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
Wenn es also knallt, hat das andere Gründe, die (da du dein Code nicht gepostet hast) ich nicht nennen kann.
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.
Re: Eventschleife nicht anhalten bei Menüklick
Verfasst: 27.05.2013 13:36
von Joshua314
NicTheQuick 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.
Hi
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