Eventschleife nicht anhalten bei Menüklick

Für allgemeine Fragen zur Programmierung mit PureBasic.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Eventschleife nicht anhalten bei Menüklick

Beitrag 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
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Noch ne Frage

Beitrag von Bisonte »

Vielleicht hilft Dir AddwindowTimer() weiter ?
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​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Noch ne Frage

Beitrag 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.
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
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Noch ne Frage

Beitrag 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
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Noch ne Frage

Beitrag 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
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Noch ne Frage

Beitrag 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.
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
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Eventschleife nicht anhalten bei Menüklick

Beitrag 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
Antworten