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