Seite 1 von 1

Uhr

Verfasst: 11.09.2004 12:19
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 

Verfasst: 11.09.2004 12:42
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

Verfasst: 11.09.2004 16:28
von Tibor
Wieso macht ihr es nicht so?

Code: Alles auswählen

Procedure STOPUHR() 
  SetGadgetText(12,FormatDate("%hh:%ii:%ss", Date())) 
EndProcedure

Verfasst: 11.09.2004 16:30
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.

Verfasst: 11.09.2004 16:32
von Tibor
Ist mir 3 Sekunden vor deinem Postig auch aufgefallen.
Peinlich, peinlich... *schämt sich* :oops:

Verfasst: 11.09.2004 17:47
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

Verfasst: 11.09.2004 18:14
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 

Verfasst: 11.09.2004 18:29
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.

Verfasst: 12.09.2004 13:03
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: