Seite 1 von 1

..meine Zeit läuft ab...

Verfasst: 17.11.2005 16:05
von Tafkadasom2k5
...doch in meinem Programm viel zu langsam ;)
Oder zu schnell...
Also bei mir geht es, aber Bekannte sagen, dass die Zeitanzeige RAST.

Gr33tz
Der Marc
P.S.:Bitte keine Diskussuion wie unpräzise Delays bei Zeitanzeigen sind..es soll ja nurn "ungenaues Tools" sein ;)

Code: Alles auswählen

;- Window Constants
;
OpenLibrary(0,"user32.dll")

Global Ueberschrift.s
Ueberschrift = "Marc`s Sleep-Timer V1.3"



Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #String_0
  #String_1
  #Text_1
  #Text_2
  #Button_0
  #CheckBox_1
  #CheckBox_2
  #String_2
  #Text_3
  #Button_1
  #Button_2
  #Text_4
  #Button_3
  #Text_6
  #Text_7
  #Text_5
  #Image_1
  
EndEnumeration

;- Fonts
;
Global FontID1
FontID1 = LoadFont(1, "Comic Sans MS", 16, #PB_Font_Bold)
Global FontID3
FontID3 = LoadFont(4, "Arial", 12, #PB_Font_Bold)
Global FontID4
FontID4 = LoadFont(2, "Arial", 12)
Global FontID5
FontID5 = LoadFont(3, "Arial", 11)




UseJPEGImageDecoder()
LoadImage(1,"D:\Images.gif")

Global Image0

;- Catch Images
Image0 = CatchImage(0, ?Image0)

;- Images
DataSection
Image0:
IncludeBinary "Noten.bmp"
EndDataSection




Procedure CheckChars()
  
  For I=1 To Len(GetGadgetText(#String_0))
    If Mid(GetGadgetText(#String_0),I,1) = "1" Or Mid(GetGadgetText(#String_0),I,1) = "2" Or Mid(GetGadgetText(#String_0),I,1) = "3" Or Mid(GetGadgetText(#String_0),I,1) = "4" Or Mid(GetGadgetText(#String_0),I,1) = "5" Or Mid(GetGadgetText(#String_0),I,1) = "6" Or Mid(GetGadgetText(#String_0),I,1) = "7" Or Mid(GetGadgetText(#String_0),I,1) = "8" Or Mid(GetGadgetText(#String_0),I,1) = "9" Or Mid(GetGadgetText(#String_0),I,1) = "0" Or Mid(GetGadgetText(#String_0),I,1) = ""
       Else
       MessageRequester("Fehler:","Die Eingabefelder dürfen keine Zeichen ausser Zahlen enthalten")
       SetGadgetText(#String_0,"")
       Goto Anfang
     EndIf
  Next
  
  For I=1 To Len(GetGadgetText(#String_1))
    If Mid(GetGadgetText(#String_1),I,1) = "1" Or Mid(GetGadgetText(#String_1),I,1) = "2" Or Mid(GetGadgetText(#String_1),I,1) = "3" Or Mid(GetGadgetText(#String_1),I,1) = "4" Or Mid(GetGadgetText(#String_1),I,1) = "5" Or Mid(GetGadgetText(#String_1),I,1) = "6" Or Mid(GetGadgetText(#String_1),I,1) = "7" Or Mid(GetGadgetText(#String_1),I,1) = "8" Or Mid(GetGadgetText(#String_1),I,1) = "9" Or Mid(GetGadgetText(#String_1),I,1) = "0" Or Mid(GetGadgetText(#String_1),I,1) = ""
    Else
       MessageRequester("Fehler:","Die Eingabefelder dürfen keine Zeichen ausser Zahlen enthalten")
       SetGadgetText(#String_1,"")
       Goto Anfang
    EndIf
  Next
  
  
  
  For I=1 To Len(GetGadgetText(#String_2))
    If Mid(GetGadgetText(#String_2),I,1) = "1" Or Mid(GetGadgetText(#String_2),I,1) = "2" Or Mid(GetGadgetText(#String_2),I,1) = "3" Or Mid(GetGadgetText(#String_2),I,1) = "4" Or Mid(GetGadgetText(#String_2),I,1) = "5" Or Mid(GetGadgetText(#String_2),I,1) = "6" Or Mid(GetGadgetText(#String_2),I,1) = "7" Or Mid(GetGadgetText(#String_2),I,1) = "8" Or Mid(GetGadgetText(#String_2),I,1) = "9" Or Mid(GetGadgetText(#String_2),I,1) = "0" Or Mid(GetGadgetText(#String_2),I,1) = ""
    Else
      MessageRequester("Fehler:","Die Eingabefelder dürfen keine Zeichen ausser Zahlen enthalten")
      SetGadgetText(#String_2,"")
      Goto Anfang
    EndIf
  Next
  
  Repeat
    If Val(GetGadgetText(#String_2)) > 60
      Minutes = Minutes + 1
      Str.l = Val(GetGadgetText(#String_2)) - 60
      SetGadgetText(#String_2,Str(Str))
    EndIf
  Until Val(GetGadgetText(#String_2)) < 60
  
  Str = Val(GetGadgetText(#String_1))
  Str = Str + Minutes
  SetGadgetText(#String_1,Str(Str))
  
  Repeat
    If Val(GetGadgetText(#String_1)) >60
      Hours = Hours + 1
      Str = Val(GetGadgetText(#String_1)) - 60
      SetGadgetText(#String_1,Str(Str))
    EndIf
  Until Val(GetGadgetText(#String_1)) < 60
  
  Str = Val(GetGadgetText(#String_0))
  Str = Str + Hours
  SetGadgetText(#String_0,Str(Str))
  
EndProcedure

Procedure Reset()  
SetGadgetText(#String_0,"0")
SetGadgetText(#String_1,"0")
SetGadgetText(#String_2,"0")
SetGadgetText(#Button_0,"Go")
DisableGadget(#CheckBox_1,0)
DisableGadget(#CheckBox_2,0)
DisableGadget(#Button_0,0)
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 400, 200, 265, 242,  #PB_Window_SystemMenu  | #PB_Window_TitleBar | #PB_Window_MinimizeGadget, Ueberschrift)
    If CreateGadgetList(WindowID())
      TextGadget(#Text_0, 50, 30, 150, 30, "Sleep - Timer")
      SetGadgetFont(#Text_0, FontID1)
      StringGadget(#String_0, 10, 100, 70, 30, "")
      GadgetToolTip(#String_0, "Hier die Stunden eingeben...")
      SetGadgetFont(#String_0, FontID1)
      StringGadget(#String_1, 100, 100, 70, 30, "")
      GadgetToolTip(#String_1, "Hier die Minuten eintragen...")
      SetGadgetFont(#String_1, FontID1)
      TextGadget(#Text_1, 10, 70, 50, 20, "Stunden:")
      TextGadget(#Text_2, 100, 70, 50, 20, "Minuten:")
      ButtonGadget(#Button_0, 100, 160, 70, 30, "Go")
      CheckBoxGadget(#CheckBox_1, 20, 210, 65, 30, "Signalton")
      CheckBoxGadget(#CheckBox_2, 150, 210, 90, 30, "Herunterfahren")
      StringGadget(#String_2, 190, 100, 70, 30, "")
      GadgetToolTip(#String_2, "Hier bitte die Sekunden eingeben...")
      TextGadget(#Text_3, 190, 70, 60, 20, "Sekunden:")
      SetGadgetFont(#String_2, FontID1)
    EndIf
  EndIf
EndProcedure
Procedure Open_Window_1()
  If OpenWindow(#Window_1, 390, 260, 280, 100, #PB_Window_TitleBar , "Signal-Fenster")
    If CreateGadgetList(WindowID())
      ButtonGadget(#Button_1, 30, 60, 130, 30, "Abbrechen")
      TextGadget(#Text_6, 50, 20, 90, 40, "Signal...")
      SetGadgetFont(#Text_6, FontID1)
      ImageGadget(#Image_1, 190, 20, 73, 51, Image0)
      
    EndIf
  EndIf
EndProcedure



Open_Window_0()

Anfang:

SetGadgetText(#String_0,"0")
SetGadgetText(#String_1,"0")
SetGadgetText(#String_2,"0")
SetGadgetText(#Button_0,"Go")
DisableGadget(#CheckBox_1,0)
DisableGadget(#CheckBox_2,0)

Repeat
  
  EventID = WaitWindowEvent()
  
  If GetGadgetState(#CheckBox_1) = 1 And check <> 1
    Soundfile.s = OpenFileRequester("Soundfile","C:\","Soundfiles|*.wav; *.mp3; *.wma; *.mid; .*midi",0)
    check = 1
  EndIf
  
  
  If Soundfile.s = ""
    SetGadgetState(#CheckBox_1,0)
  ElseIf check = 1
    
   
    
  
    
    
    
  EndIf
  
  If check = 1 And GetGadgetState(#CheckBox_1) = 0
    check = 0
  EndIf
  
  If EventID = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  
  If EventID = #PB_Event_Gadget
    
    
    If EventGadgetID() = #Button_0
      CheckChars()
      
      SetGadgetText(#Button_0,"Abbrechen")
      
      Stunden.l =  Val(GetGadgetText(#String_0))
      Minuten.l =  Val(GetGadgetText(#String_1))
      Sekunden.l = Val(GetGadgetText(#String_2))
      
      SetGadgetText(#Button_0,"Abbrechen") 
      
      If GetGadgetState(#CheckBox_2) = 1
        Shutdowns.s = "Shutdown"
      EndIf
      
      
      Repeat
        
        DisableGadget(#CheckBox_1,1)
        DisableGadget(#CheckBox_2,1)
        
        EventID = WindowEvent()
        
        If EventID = 5 Or Title = 1
          Ueberschrift = Str(Stunden) + " Stunden " + Str(Minuten) + " Minuten " + Str(Sekunden) + " Sekunden"
          SetWindowTitle(#Window_0,Ueberschrift.s)
          Title = 1
        EndIf
        
        If EventID = 15
          Ueberschrift = "Marc`s Sleep-Timer V1.3"
          SetWindowTitle(#Window_0,Ueberschrift.s)
          Title = 0
        EndIf
        
        
        
        If EventID = #PB_Event_Gadget
          
          If EventGadgetID() = #Button_0
            
            Antwort = MessageRequester("Bestätigung","Wollen Sie den Countdown abbrechen?",#PB_MessageRequester_YesNo)
            
            If Antwort = 6
              SetGadgetText(#String_0,"0")
              SetGadgetText(#String_1,"0")
              SetGadgetText(#String_2,"0")
              Goto Anfang
            EndIf
            
          EndIf
          
          If EventGadgetID() = #PB_Event_CloseWindow
            Antwort = MessageRequester("Bestätigung","Wollen Sie den Countdown abbrechen und das Programm schliessen?",#PB_MessageRequester_YesNo)
            
            If Antwort = 6
              SetGadgetText(#String_0,"0")
              SetGadgetText(#String_1,"0")
              SetGadgetText(#String_2,"0")
              Quit = 1
              Goto Ende
            EndIf
            
          EndIf
          
        EndIf
        
        If Delay = 0
          Sekunden = Sekunden - 1
          
          If Sekunden = -1 And Minuten <> 0
            Minuten = Minuten - 1
            Sekunden = 59
          EndIf
          
          If Sekunden = -1 And Minuten = 0 And Stunden <> 0
            Stunden = Stunden - 1
            Minuten = 59
            Sekunden = 59
          EndIf
          
          SetGadgetText(#String_0,Str(Stunden))
          SetGadgetText(#String_1,Str(Minuten))
          SetGadgetText(#String_2,Str(Sekunden))
          Delay = 1000
        Else
          Delay = Delay - 1
        EndIf
        
        Delay(1) 
        
      Until Sekunden = <0 And Minuten = 0 And Stunden = 0
      
      SetWindowTitle(#Window_0,"Marc`s Sleep-Timer V1.3")
      
      
      
      
      If check = 1
        SetGadgetText(#Button_0,"Go")
        DisableGadget(#Button_0,1)
        
        
        MCI_Load(1,Soundfile)
        laenge = MCI_GetLength(1)
        
        MCI_Play(1)
        
         
        Open_Window_1()
        
        Delay = 0
        Volume.f = 0

        Repeat
          EventID = WindowEvent()
          Delay(1)
          Delay + 1
          If Delay = 100
             laenge = laenge - 100
             Delay = 0
          EndIf
          
          If Volume <> 1000
             Volume = Volume + 0.25
             MCI_SetVolume(1,Volume)
          EndIf
           

            
        
        Until laenge < 0 Or EventGadgetID() = #Button_1
       
        If EventGadgetID() = #Button_1
           abbruch = 1
        EndIf
        
          MCI_Stop(1)
          CloseWindow(#Window_1)
          MCI_Free(1)
          Reset()

        
          If GetGadgetState(#CheckBox_2) = 1 And abbruch <> 1
            
          
            RunProgram("c:/windows/system32/tsshutdn","0 /Delay:0 /Powerdown","",2)
            
            Quit =1
            Goto Ende
            
          
          SetGadgetText(#Button_0,"Go")
          DisableGadget(#Button_0,0)
        Else
          abbruch = 0
        EndIf
        
          check = 0
          SetGadgetState(#CheckBox_1,0)
      
        ElseIf  check = 0 And GetGadgetState(#CheckBox_2) <> 0
          
          
          RunProgram("c:/windows/system32/tsshutdn","0 /Delay:0 /Powerdown","",2)
          
          Quit =1
          Goto Ende
          
        Else
          Reset()        
        EndIf 
    
   EndIf
  EndIf
  
  Delay = 100
  
  Ende:
Until Quit = 1

Verfasst: 17.11.2005 16:45
von Laurin
Bei mir bleibt der Counter einfach stehen, sobald eine Sekunde abgelaufen ist :?

Verfasst: 18.11.2005 15:36
von Tafkadasom2k5
Mh...^^

Schonmal mit dem Delay in der Zeitschleife gespielt?
Aber warum geht bei mir diese Versin, bei anderen rast sie und bei dir bleibt sie stehen?

Gr33tz
Der Marc

Verfasst: 03.04.2006 22:28
von Tafkadasom2k5
Sorry, wenn ich das Thema nochmal hochhole..
Aber WTF geht da schief...?

Gr33tz
Tafkadasom2k5


P.S.:Ja, der Code is Dyyyrrrrrtiii, aber da stehen wir doch alle irgendwie drauf :allright:
Und so schwer ist die Zeitschleife trotz der nicht vorhandenen Kommentare auch ned zu finden.... ;)

Verfasst: 04.04.2006 04:27
von Kaeru Gaman
wobei es auch nicht zuviel verlangt gewesen wäre,
die entsprechende stelle rauszuschneiden,
und uns den rest zu ersparen.. oder? ;)

Code: Alles auswählen

        If Delay = 0 
          Sekunden = Sekunden - 1 
          
          If Sekunden = -1 And Minuten <> 0 
            Minuten = Minuten - 1 
            Sekunden = 59 
          EndIf 
          
          If Sekunden = -1 And Minuten = 0 And Stunden <> 0 
            Stunden = Stunden - 1 
            Minuten = 59 
            Sekunden = 59 
          EndIf 
          
          SetGadgetText(#String_0,Str(Stunden)) 
          SetGadgetText(#String_1,Str(Minuten)) 
          SetGadgetText(#String_2,Str(Sekunden)) 
          Delay = 1000 
        Else 
          Delay = Delay - 1 
        EndIf 
        
        Delay(1) 

      Until Sekunden = <0 And Minuten = 0 And Stunden = 0 
also, du machst hier allen ernstes eine schleife, in die du ein Delay(1) einbaust,
und bei der du dann tausend durchläufe zählst...

respekt, das ist so ziemlich die abenteuerlichste methode, die zeit zu messen, die ich jemals gesehen habe,
darauf muss ich mich erstmal mit Archimedes zusammen hinsetzen und einen trinken,
der lacht sich nämlich grad nen Ast...

nein ernsthaft, das ist ungefähr so genau, als wenn ich bei nem Raumschiff die Knotenleine raushänge, um die Geschwindigkeit zu ermitteln...
nein, der Vergleich hinkt.. mir fällt einfach nix vergleichbares ein...

probiers doch einfach mal anders...

zuerst vergiss die anzahl der schleifendurchläufe, das ist etwas,
was zu variabel ist, um als irgendeine Basis zu dienen.

um deine Grundsekunde zu ermitteln, benutz einfach mal ElapsedMilliseconds()

da ElapsedMilliseconds() eine ungenauigkeit von ca. 13 ms besitzt empfehle ich außerdem,
deine Timervariable (die ich jetzt einführe) nicht auf den aktuellen stand zu setzen, sondern um 1000 zu erhöhen.

weiterhin kannst du die Ifs für deinen counter schachteln,
sowas ist generell praktisch bei voneinander abhängigen änderungen.

dann nimm ins Until nur ein EXIT-flag.

und nimm Delay(0), das genügt völlig, um die CPU nicht zu braten,
außerdem entgehen dir dann keine Win-Events, die genau in dieser ms stattfinden...

zusammen sähe das dann so aus:

direkt vor die Hauptschleife:

Code: Alles auswählen

EXIT.l = 0
Timer.l = ElapsedMilliseconds() + 1000     ; schon plus die erste Sekunde

Repeat     ; das ist dein Repeat, was du schon drin hast
und dann der neue Timer (ersetzt deine Zeitermittlung):

Code: Alles auswählen

   If ElapsedMilliseconds() >= Timer
      Timer + 1000
      Sekunden -1
      If Sekunden < 0
         Sekunden = 59
         Minuten -1
         If Minuten <0
            Minuten = 59
            Stunden -1
            If Stunden <0
               Stunden = 0
               EXIT = 1
            EndIf
         EndIf
      EndIf
   EndIf

   SetGadgetText(#String_0,Str(Stunden)) 
   SetGadgetText(#String_1,Str(Minuten)) 
   SetGadgetText(#String_2,Str(Sekunden)) 

   Delay(0)

Until EXIT = 1
dieser Timer ist nun eigentlich sogar sehr genau, da die Meßungenauigkeiten von ElapsedMilliseconds nicht addiert werden.

das "Stunden = 0" über dem "EXIT = 1" dient nur dazu,
deine Gadgetanzeige nicht "-1" anzeigen zu lassen...

...was den rest des Codes angeht, den hab ich mir gar nicht angesehen,
also deute mein schweigen diesbezüglich nicht als einverständnis... ;)

Verfasst: 04.04.2006 07:38
von Karl
Mal ein völlig anderer Ansatz:

Warum lässt du nicht die Zielzeit eingeben
setzt einen Timer, der alle ... Sekunden prüft, ob die Zeit abgelaufen ist
wenn ja SystemPowerDown

Und gut ist.

Gruß

Der Karl