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. :wink:

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 :oops:

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
:allright:
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 :wink: