Menu bzw Event Fragen - Zeitproblem

Anfängerfragen zum Programmieren mit PureBasic.
willib
Beiträge: 8
Registriert: 29.12.2008 21:21
Wohnort: Bielefeld

Menu bzw Event Fragen - Zeitproblem

Beitrag 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
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
willib
Beiträge: 8
Registriert: 29.12.2008 21:21
Wohnort: Bielefeld

Beitrag 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
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag 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
     
Zuletzt geändert von X360 Andy am 29.12.2008 23:17, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
willib
Beiträge: 8
Registriert: 29.12.2008 21:21
Wohnort: Bielefeld

Beitrag von willib »

Ich habe grade gemerkt das es beim Popup Menu auch so ist

Gruß Willi
willib
Beiträge: 8
Registriert: 29.12.2008 21:21
Wohnort: Bielefeld

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
willib
Beiträge: 8
Registriert: 29.12.2008 21:21
Wohnort: Bielefeld

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten