Seite 1 von 5
Menu bzw Event Fragen - Zeitproblem
Verfasst: 29.12.2008 21:40
von willib
Hallo alle
Ich Programmiere schon ein bissl in Purebasic und habe ein paar Fragen für die ich hier keine Antwort gefunden habe ( kommt selten vor

)
Wenn ein Menu angeklickt wird, wird die Programmausführung angehalten, bis der user das Menu verlässt.
Kann man das irgentwie verhindern ?
Alternativ würde mir auch eine Zeit reichen wann ein AvailableProgramOutput() angekommen ist !
andere events wäre vielleicht auch interessant ( network )
Ich werde versuchen eine sinnvollen code dafür zu kontsruieren ( ping -t oder so

) das kann aber ein bissl dauern !
Viellleicht hatte ja schon mal einer das Problem.
Desweitern : kann man ausrechnen wie groß (breite höhe) ein Popoup Menu wird bzw ist um es optimal zu platzieren ( in einer Ecke rechts unten )
Schon mal vielen Dank im voraus !
Gruß aus Bielefeld
Willi
Verfasst: 29.12.2008 21:43
von PMV
Wenn ein Menu angeklickt wird, wird die Programmausführung angehalten, bis der user das Menu verlässt.
Kann man das irgentwie verhindern ?
Fehler in deiner Programmlogik, Windows hält zumindest nicht die
Programmausführung an, Linux und Mac sicher auch nicht.
Netzwerk hat nichts mit Fenstern zu tun und hat deswegen sein eigenes
Eventsystem.
MFG PMV
Verfasst: 29.12.2008 22:58
von willib
Hi PMV
Vielen Dank für deinen Tip.
Versuche bitte mal :
Code: Alles auswählen
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
If CreateMenu(0, WindowID(0)) ; hier beginnt das Erstellen des Menüs...
MenuTitle("Project")
MenuItem(1, "Open" +Chr(9)+"Ctrl+O")
MenuItem(2, "Save" +Chr(9)+"Ctrl+S")
MenuItem(3, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(4, "Close" +Chr(9)+"Ctrl+C")
EndIf
Repeat :
Delay(100)
Debug ElapsedMilliseconds()
Until WindowEvent()=#PB_Event_CloseWindow
EndIf
Ich weiss das das so nicht schön ist aber wenn man in das Menu geht sieht man schön wie der debug aufhört ...
Das Programm im Hintergrund soll ja weitermachen.
Was ist falsch wenn man das so macht, bzw. was mache ich falsch ?
Ich habe Windows und pb4.2
Ich sehe zu das ich das Beispiel noch besser hinbekomme aber vom Grundsatz ist es bei mir so.
Gruß Willi
Verfasst: 29.12.2008 23:02
von X360 Andy
Ich wollte darüber auch mal einen Thread machen habs dann aber doch gelassen
Das ist besonders "nervig" wenn man ein Quiz hat , wo es um Zeit / Punkte geht.
Weil wenn man dann auf das Menü (oder die gesamte leiste) dann wird es "angehalten".
EDIT
Code: Alles auswählen
InitSprite()
Procedure Window()
Protected EventID
Shared Quit
EventID = WindowEvent()
Repeat
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
EventID = WindowEvent()
Until EventID = 0
EndProcedure
OpenWindow(0, 100, 100, 200, 200, "HIER drücken", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 200, 200, 0, 0, 0)
SetFrameRate(50)
Repeat
Window()
ClearScreen(0)
StartDrawing(ScreenOutput())
Circle(x, 80, 25, $ffffff)
StopDrawing()
x + 1
If x>200
x = 0
EndIf
Delay(1)
FlipBuffers()
Until quit = 1
Verfasst: 29.12.2008 23:09
von Kiffi
willib hat geschrieben:Das Programm im Hintergrund soll ja weitermachen.
in diesem Fall würde sich ein Thread eignen:
Code: Alles auswählen
Procedure myThread(dummy)
Protected T
Repeat
If ElapsedMilliseconds() > T + 1000
T = ElapsedMilliseconds()
Debug T
EndIf
Delay(10)
ForEver
EndProcedure
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
If CreateMenu(0, WindowID(0)) ; hier beginnt das Erstellen des Menüs...
MenuTitle("Project")
MenuItem(1, "Open" +Chr(9)+"Ctrl+O")
MenuItem(2, "Save" +Chr(9)+"Ctrl+S")
MenuItem(3, "Save as"+Chr(9)+"Ctrl+A")
MenuItem(4, "Close" +Chr(9)+"Ctrl+C")
EndIf
CreateThread(@myThread(), 42)
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
(die ElapsedMilliseconds() > T - Abfrage ist suboptimal, aber als schnelles
Anschauungsobjekt sei mir das bitte verziehen

)
Grüße ... Kiffi
Verfasst: 29.12.2008 23:12
von willib
Ich habe grade gemerkt das es beim Popup Menu auch so ist
Gruß Willi
Verfasst: 29.12.2008 23:28
von willib
Hi Kiffi
Vielen Dank, das könnte eine Lösung sein, dafür muß ich allerdings sehr viel umschreiben, gibt es denn nix anderes ?
Um das Thema habe ich mich bislang immer gedrückt
Gruß Willi
Verfasst: 29.12.2008 23:40
von ts-soft
Thread halte ich für unnötig (wie meist)
Ein Timer der die Dinge unabhängig vom Eventloop macht sollte doch reichen.
Hier mal im Sekundentakt:
Code: Alles auswählen
Procedure mytimercallback(a,b,c,d)
Debug "diesen code werde ich jede sekunde ausführen"
EndProcedure
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 300, "bla")
; menü und gadgets erstellen
SetTimer_(WindowID(0), 1, 1000, @mytimercallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf
Verfasst: 30.12.2008 19:36
von willib
Hi TS-Soft
super, das löst mein "ablauf" Problem !
hier der code nun
Code: Alles auswählen
Procedure mytimercallback(a,b,c,d)
Debug "diesen code werde ich jede sekunde ausführen" + StrU(ElapsedMilliseconds(), #Long )
EndProcedure
If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
SetTimer_(WindowID(0), 1, 1000, @mytimercallback())
If CreateMenu(0, WindowID(0)) ; hier beginnt das Erstellen des Menüs...
MenuTitle("Project")
MenuItem(1, "Open" +Chr(9)+"Ctrl+O")
MenuItem(2, "Save" +Chr(9)+"Ctrl+S")
EndIf
Repeat :
Delay(200)
Debug ElapsedMilliseconds()
Until WindowEvent()=#PB_Event_CloseWindow
EndIf
Interessant ist das es beim ersten mal relativ lange dauert
Gruß Willi
Verfasst: 30.12.2008 19:40
von ts-soft
Ich hoffe mal, der Eventloop mit WindowEvent() ist nur so zu testzwecken,
WaitWindowEvent() sollte immer verwendet werden und Delay hat im
EventLoop absolut garnichts zu suchen
