Seite 1 von 2

Zeitevent mit (merkwürdigen) Hindernissen

Verfasst: 13.12.2006 00:42
von netzer
Nabend allerseits,

und wieder ein kleines Problem aus der Anfängerfraktion:
Ich bastele gerade an einem Programm für eine MySQL-Abfrage. Als kleines Bonus wollte ich einen Intervall einbauen, der alle 10 Sekunden überprüft, ob die Verbindung zur Datenbank noch besteht. Mein Ansatz für den Intervall habe ich wie folgt realisiert:

Code: Alles auswählen

If OpenWindow(0,0,0,170,120,"Zeitschleife", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  If CreateGadgetList(WindowID(0))
    ButtonGadget(2, 20, 20, 60, 20, "Ende")
    StringGadget(3, 20, 60, 60, 20, Time$)
  EndIf
  
  Repeat  
    
    Time$ = FormatDate("%ss", Date())
    SetGadgetText(3, Time$);Diese Zeile auskommentieren
    
    If Time$ = "10"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf 
    
    If Time$ = "20"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf 
    
    If Time$ = "30"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf
    
    If Time$ = "40"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf        
    
    If Time$ = "50"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf    
    
    If Time$ = "00"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf    
    
    EventID = WaitWindowEvent()
        
    If EventID = #PB_Event_CloseWindow 
      Quit = 1
    EndIf 
    
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 2 
          Quit = 1
        
      EndSelect
    
    EndIf
  Until Quit = 1
      
EndIf
Durch die Repeat-Funktion und der Ausgabe der Sekunden im StringGadget erhöht sich meine Prozessorlast annähernd 100%, aber der Code wird so ausgeführt, wie ich es mir wünsche.

Kommentiere ich Zeile 11 aus (;SetGadgetText), ist die Prozessorlast gering, die einzelnen If-Bedingungen werden aber nicht mehr regelmäßig ausgeführt. Anstatt des 10-Sekunden-Intervalls kommen undefinierbare Abstände (halt digital: geht / geht nicht :? ).

Fasziniert von diesem Dilemma stellen sich mir nun zwei Fragen:
1) Warum gibt es solch unterschiedliches Codeverhalten?
2) Gibt es in PB sinnvollere "Zeitaufträge"?

Gruß vom Netzer

Und immer wenn Du denkst, es geht nicht mehr, kommt von irgendwo ne Flanke her!

Re: Zeitevent mit (merkwürdigen) Hindernissen

Verfasst: 13.12.2006 00:49
von Kiffi
Hallo Günther,

> Als kleines Bonus wollte ich einen Intervall einbauen, der alle 10
> Sekunden überprüft, ob die Verbindung zur Datenbank noch besteht.

das kann am besten mittels Timer aus den PBOSL realisiert werden:

Code: Alles auswählen

Procedure MachWas()
  Debug "Hallo!"
EndProcedure

OpenWindow  (0, #PB_Ignore, #PB_Ignore, 300, 300, "Timer-Test")
 
StartTimer(0, 10000, @MachWas()) ; Alle 10 Sekunden wird die Proc MachWas() angesprungen
 
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

EndTimer(0)
Grüße ... Kiffi

Verfasst: 13.12.2006 01:15
von ts-soft
Ohne Lib gehts auch, nur falls Du keine Libs magst.

Code: Alles auswählen

Procedure CB_Timer(hWnd.l, uMsg, IDEvent, dwTime)
  
  Protected Time$ = FormatDate("%ss", Date())
  SetGadgetText(3, Time$);Diese Zeile auskommentieren 
  
 
    If Time$ = "10"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf
   
    If Time$ = "20"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf
   
    If Time$ = "30"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf
   
    If Time$ = "40"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf       
   
    If Time$ = "50"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf   
   
    If Time$ = "00"
      MessageRequester("Durchlauf", "Mach jetzt was")
    EndIf   
EndProcedure 


If OpenWindow(0,0,0,170,120,"Zeitschleife", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SetTimer_(WindowID(0), 1, 1000, @CB_Timer())
  If CreateGadgetList(WindowID(0))
    ButtonGadget(2, 20, 20, 60, 20, "Ende")
    StringGadget(3, 20, 60, 60, 20, Time$)
  EndIf
 
  Repeat 
   
    EventID = WaitWindowEvent()
       
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
   
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 2
          Quit = 1
       
      EndSelect
   
    EndIf
  Until Quit = 1
     
EndIf
KillTimer_(WindowID(0), 1)

Verfasst: 13.12.2006 01:18
von netzer
@Kiffi & TS
Hallo Günther,
Danke für die Steilpässe
Warum gibt es solch unterschiedliches Codeverhalten?
Mit dieser Frage stehe ich scheinbar im abseits...

Verfasst: 13.12.2006 01:28
von Kaeru Gaman
nuja.. du hast da ein WaitWindowEvent() drin,
das wartet auf jeden fall auf ein ereignis.

wenn du das SetGadgetText auskommentierst, findet kein set-event mehr statt.
wenn du dann nicht mal die maus bewegst oder wohin klickst oder sonst nix passiert,
dann gibt es kein event und das programm wartet weiter brav beim WaitWindowEvent().

auf jeden fall solltest du mit nem richtigen timer arbeiten.
ob du mit oder ohne Lib arbeiten möchtest, ist dir überlassen,
beide lösungen von den Kollegen sind praktikabel, je nach vorliebe.

Verfasst: 13.12.2006 01:32
von ts-soft
In einer Ereignisschleife gehört nichts, aber auch garnicht, was nicht
unmittelbar mit den Events zu tun hat.

Durch die Timerprocedure stellts Du Windows einen Ansprechpartner zur
Verfügung, den es nutzen kann, ohne das die eigentlich Eventschleife
betroffen ist.

Die Eventschleife von PB ist Einsteigerfreundlich, aber eben nicht für alles
optimal geeignet, deswegen hat man ja noch die API zur Verfügung :wink:

Verfasst: 13.12.2006 02:03
von netzer
:allright: Jau, Groschen ist gefallen!

Vielen Dank Euch allen...


:twisted: It´s a long way to the top... (Bon Scott)

Verfasst: 15.12.2006 19:41
von HemSA
Hallo ts-soft,
ich habe mal aus Neugierte den Anfang der Procedure von

Code: Alles auswählen

Procedure CB_Timer(hWnd.l, uMsg, IDEvent, dwTime)
in

Code: Alles auswählen

Procedure CB_Timer()
geändert. Ich konnte keinen Unterschied im Programablauf feststellen. Gibt es da etwas was bei der 1. Version zu beachten ist?

Danke schon mal im Vorraus.

Verfasst: 15.12.2006 19:46
von ts-soft
@HemSA
Korrekt hat das TimerCallback 4 Parameter, sollte man also so nutzen, auch
wenn man die Werte nicht auswertet!

Verfasst: 15.12.2006 19:54
von DarkSoul
Setz mal ein 'Delay (1)' vor den 'until'-befehl. theoretisch geht auch Delay (10), ist noch ein bisschen besser, kann die intervalle minimal verfälschen.