Uhr

Für allgemeine Fragen zur Programmierung mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Uhr

Beitrag von CNESM »

Hi,

ich hab ihr eine einfache uhr, die mir die Prozesslaufzeit anzeigen soll (d.h. wie lange der Prozess bereits läuft). Dafür zählt Sie einfach hoch. Das ganze funktioniert auch so. Das Problem was ich habe, besteht darin, das diese Uhr abhängig von meiner Prozessauslastung arbeitet. Soll bedeuten, habe ich eine starke Auslastung meines PC, zählt die Uhr nicht richtig, was zu verfälchten Ergebnissen führt, weil die Uhr mal stehen bleibt etc. Wie würdet ihr das ganze handhaben oder lässt sich sowas ganricht anderst regeln? Zudem stört mich die Nutzung von Sleep. Das muss auf jedenfall noch raus, da so der Prozess immer angehalten wird. Vielleicht könnt ihr mal euere Purebasic Augen drauf werfen :) Danke :)

Code: Alles auswählen

Global sec,min,std

Procedure STOPUHR()
  sleep_(1000)
  sec=sec+1
  
  If sec=60
    sec=0
    min=min+1
    If min=60
      min=0
      std=std+1
    EndIf
  EndIf 
  
  SetGadgetText(12,Str(std)+":"+Str(min)+":"+Str(sec))
  
EndProcedure

If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")

  CreateGadgetList(WindowID(0)) 
  TextGadget(12,10,10,250,20,"") 
  

  
  Repeat
    EventID.l = WindowEvent()

    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
    
    ;Sleep_(1000)
   STOPUHR()
    

Until Quit = 1
  
EndIf

End 
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Also ich würd das so in der Art versuchen:

Code: Alles auswählen

Procedure STOPUHR() 
  Static lasttime
  If lasttime = 0:lasttime = ElapsedMilliseconds():EndIf
  If ElapsedMilliseconds() - lasttime >= 1000
    lasttime + 1000
    sec=sec+1 
    
    If sec=60 
      sec=0 
      min=min+1 
      If min=60 
        min=0 
        std=std+1 
      EndIf 
    EndIf 
    
    SetGadgetText(12,Str(std)+":"+Str(min)+":"+Str(sec)) 
  EndIf
  
EndProcedure
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Tibor
Beiträge: 42
Registriert: 29.08.2004 03:25
Wohnort: Mittelerde, südlich der großen Grasplantagen

Beitrag von Tibor »

Wieso macht ihr es nicht so?

Code: Alles auswählen

Procedure STOPUHR() 
  SetGadgetText(12,FormatDate("%hh:%ii:%ss", Date())) 
EndProcedure
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Tibor hat geschrieben:Wieso macht ihr es nicht so?

Code: Alles auswählen

Procedure STOPUHR() 
  SetGadgetText(12,FormatDate("%hh:%ii:%ss", Date())) 
EndProcedure
Weil da die Systemzeit angezeigt wird und nicht die Zeit, seit dem der Prozess läuft.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Tibor
Beiträge: 42
Registriert: 29.08.2004 03:25
Wohnort: Mittelerde, südlich der großen Grasplantagen

Beitrag von Tibor »

Ist mir 3 Sekunden vor deinem Postig auch aufgefallen.
Peinlich, peinlich... *schämt sich* :oops:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Na dann macht man die Zeit ganz einfach abhängig von der Startzeit. Was ist daran so schwer:

Code: Alles auswählen

Global sec.l, min.l, std.l, start.l

Procedure STOPUHR() 
  Protected diff.l
  Static old_diff.l
  
  diff.l = (ElapsedMilliseconds() - start) / 1000
  
  If diff <> old_diff Or diff = 0
    old_diff = diff
    
    sec = diff % 60
    diff / 60
    min = diff % 60
    diff / 60
    std = diff
    
    SetGadgetText(12, Str(std) +  ":" + RSet(Str(min), 2, "0") + ":" + RSet(Str(sec), 2, "0"))
  EndIf
  
EndProcedure

; Timer starten
start = ElapsedMilliseconds()

If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")

  If CreateGadgetList(WindowID(0))
    TextGadget(12,10,10,250,20,"")
    
    Repeat
      EventID.l = WindowEvent()
      
      If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button 
        Quit = 1 
      EndIf 
      
      Delay(10)
      STOPUHR()
    Until Quit = 1
  EndIf
EndIf

End
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Hi,

ok sind gute Beispiel u. Kommentare dabei. Hätte jetzt noch ne Frage:

Da ich in Repeat eine Funktion habe, die nun eine hohe Auslastung hat, bleibt die Uhr doch auch stehen, weil der Prozess ja ganricht erst zur Procedure STOPUHR() kommt:

Code: Alles auswählen

 Repeat 
      EventID.l = WindowEvent() 
      
      If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button 
        Quit = 1 
      EndIf 

      MeineFunktionMitVielProzessauslastung()      

      Delay(10) 
      STOPUHR() 
    Until Quit = 1 
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Code: Alles auswählen

Global StartTime

Procedure STOPUHR(hwnd.l,nIDEvent.l,uElapse.l,lpTimerFunc.l)
  Protected diff.l 
  Static old_diff.l 
  diff.l = (ElapsedMilliseconds() - StartTime) / 1000 
  
  If diff <> old_diff Or diff = 0 
    old_diff = diff 
    
    sec = diff % 60 
    diff / 60 
    min = diff % 60 
    diff / 60 
    std = diff 
    
    SetGadgetText(12, Str(std) +  ":" + RSet(Str(min), 2, "0") + ":" + RSet(Str(sec), 2, "0")) 
  EndIf 
EndProcedure

If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window") 
  
  StartTime = ElapsedMilliseconds()
  settimer_(WindowID(),1,200,@STOPUHR())

  If CreateGadgetList(WindowID(0)) 
    TextGadget(12,10,10,250,20,"") 
    
    Repeat 
      Repeat
        EventID.l = WindowEvent() 
        
        If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button 
          quit = 1 
        EndIf 
      Until EventID = 0
      
      Delay(10)
    Until quit = 1 
  EndIf 
EndIf
Musst nur oft genug WindowEvent() aufrufen.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Hi,

wow, das das so einfach geht :D

Ist echt klasse, das ihr so gut helfen könnt. Wäre echt augeschmissen, obwohl ich jetzt schon mehr als 6 jahre programmiere, hab ich keine Ahnung, was ich da überhaupt mache :) :roll:
Antworten