Seite 1 von 3

Procedure in bestimmten Zeitintervallen ausführen?

Verfasst: 21.02.2005 01:09
von Skywalker
Tach Leute.

Jemand von euch eine Idee, wie ich eine Prozedure in vorher bestimmten
Zeitintervallen ausführen kann?
Z.B.: Alle 10 Minuten soll ´Prozedure XYZ´ irgendwas machen.

Teste gerade so einiges aus, komme aber nicht zu einem sauberen Ergebnis.

Gruß
Thomas

Verfasst: 21.02.2005 01:25
von Kaeru Gaman
am einfachsten wäre es, in der hauptschleife, die ja normalerweise mehrmals pro sekunde ausgeführt wird,
die zeit zu überwachen und diese proc aufzurufen.

aber da du daran bestimmt schon gedacht hast, schildere dein problem bitte mal umfangreicher...

Verfasst: 21.02.2005 02:56
von Deeem2031

Code: Alles auswählen

Global quit.l

Procedure xyz(hwnd.l,nIDEvent.l, uElapse.l, lpTimerFunc.l)
  If MessageRequester("","5 Sekunden sind vergangen!"+Chr(10)+"Beenden?",#PB_MessageRequester_YesNo) = 6
    quit = 1
  EndIf
EndProcedure

OpenWindow(0,0,0,0,0,#PB_Window_Invisible,"")
settimer_(WindowID(),1,5000,@xyz()) ; alle 5000 millisekunden (5 sek.) xyz() ausführen

Repeat
  WaitWindowEvent()
Until quit
Funktioniert allerdings nur wenn man ein Window öffnet.

Verfasst: 21.02.2005 12:06
von hardfalcon
Weshalb nicht einfach so:

Code: Alles auswählen

Procedure SayHello(dummy.b)
MessageRequester("Mein Programm","Hallo!")
EndProcedure
Repeat
SayHello(0)
Delay(600000)
ForEver
Das kann man zur Not ja auch als zusätzlichen Thread starten. Damit wird die CPU eh besser ausgelastet...

PS: Sorry, wen mein Source Fehler enthalten sollte, aber ich habe grad kein PB zur Hand...

cya
Pascal

Verfasst: 21.02.2005 14:53
von Leo

Code: Alles auswählen

Declare Thread(a.l)
Procedure InitTimer()
    Structure Timer 
        Time.l
        Adress.l
        DelayTime.l
    EndStructure
    NewList Timer.Timer()
    CreateThread(@Thread(),0)
EndProcedure
Procedure AddTimer(Adress.l,DelayTime.l)
    AddElement(Timer())
    Timer()\Adress = Adress
    Timer()\DelayTime = DelayTime
    Timer()\Time = GetTickCount_()
EndProcedure
Procedure Print1()
    PrintN("[[Timer1]]")
EndProcedure
Procedure Print2()
    PrintN("//Timer2\\")
EndProcedure
Procedure Print3()
    PrintN("**Timer3**")
EndProcedure
Procedure Print4()
    PrintN("##Timer4##")
EndProcedure
Procedure Thread(a.l)
    Repeat
        ForEach Timer()
            If GetTickCount_() - Timer()\Time => Timer()\DelayTime
                ConsoleColor(8,0)
                PrintN("Time: "+Str(GetTickCount_()-Timer()\Time)+" ["+Str(Timer()\DelayTime)+"]")
                ConsoleColor(9,0)
                CallFunctionFast(Timer()\Adress)
                Timer()\Time = GetTickCount_()
            EndIf
        Next
        Delay(1)
    ForEver
EndProcedure

InitTimer()
AddTimer(@Print1(),5200)
AddTimer(@Print2(),1500)
AddTimer(@Print3(),1700)
AddTimer(@Print4(),2300)

OpenConsole()
MessageRequester("","Press 2 exit!")
End 
Ich hab mir jetz mal ein paar eigene Timerfunktionen programmiert, die auch ohne Fenster funktionieren :allright:

Verfasst: 21.02.2005 16:49
von Morty
Oder:

auf http://www.purearea.net in den Userlibs nach den PureTools suchen. Da ist auch eine Timerfunktion integriert, die dann eine bestimmt Prozedur aufruft.

Morty

Verfasst: 21.02.2005 17:39
von bluejoke
Oh, ich dachte die Timer-Befehle der PureTools erzeugen ein bestimmtes Event?

Verfasst: 21.02.2005 18:46
von Morty
Nee, ich benutze sie direkt zum Aufruf einer Prozedur. Steht auch so glaub ich in der PureTools Hilfe. Musst mal schauen. Vielleicht gibt' es inzwischen eine neuere Version?!?

Morty

Verfasst: 21.02.2005 18:58
von bluejoke
Du hast recht
Starts a Timer.
The procedure @procedure() is called every MilliSec.

Verfasst: 21.02.2005 20:36
von Kaeru Gaman
also, wo wir schon bei code-vorschlägen sind...

Code: Alles auswählen

RelMin = 9
RelSec = 24

...
Repeat  ; Hauptschleife
...
If ElapsedMilliseconds() >= NextCallTime
    NextCallTime = ElapsedMilliseconds()+1000*(60*RelMin+RelSec)
    MyProcedure()
EndIf
...
Until WasAuchImmer
in diesem beispiel wird die Proc alle 9 Minuten 24 Sekunden aufgerufen.