Zeitevent mit (merkwürdigen) Hindernissen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
netzer
Beiträge: 26
Registriert: 13.06.2005 20:14
Wohnort: Homeoffice

Zeitevent mit (merkwürdigen) Hindernissen

Beitrag 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!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Zeitevent mit (merkwürdigen) Hindernissen

Beitrag 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
a²+b²=mc²
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 »

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)
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
Benutzeravatar
netzer
Beiträge: 26
Registriert: 13.06.2005 20:14
Wohnort: Homeoffice

Beitrag 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...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

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:
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
Benutzeravatar
netzer
Beiträge: 26
Registriert: 13.06.2005 20:14
Wohnort: Homeoffice

Beitrag von netzer »

:allright: Jau, Groschen ist gefallen!

Vielen Dank Euch allen...


:twisted: It´s a long way to the top... (Bon Scott)
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag 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.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
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 »

@HemSA
Korrekt hat das TimerCallback 4 Parameter, sollte man also so nutzen, auch
wenn man die Werte nicht auswertet!
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
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag 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.
Bild
Antworten