Procedure in bestimmten Zeitintervallen ausführen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Skywalker
Beiträge: 77
Registriert: 22.09.2004 23:35

Procedure in bestimmten Zeitintervallen ausführen?

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

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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:
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag 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
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Oh, ich dachte die Timer-Befehle der PureTools erzeugen ein bestimmtes Event?
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag 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
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Du hast recht
Starts a Timer.
The procedure @procedure() is called every MilliSec.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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