Seite 1 von 2
"Sofortstart" vom Timer
Verfasst: 16.06.2008 19:17
von HemSA
Hallole an Alle,
ich habe einen Timer im Programm. Das klappt auch gut und ich habe keine Probleme mit dem Ablauf.
Nur ist es so, dass nach dem Start vom Programm die 1. Ausführung erst nach 360000 Millisekunden ausgeführt wird.
Gibt es auch eine Möglichkeit, das Programm gleich nach dem Start auszuführen, und danach alle 360000 Millisekunden wieder, so das man gleich sieht was rauskommt, und nicht erst 6 Minuten warten muss?
Ich mich mit den API-Befehlen nicht aus, muss ich da irgendwo eine "1" oder eine "0" einfügen?
So wie ich die Timergeschichte halbwegs verstehe schickt das Programm einen Befehl an Windows, und danach "kümmert" sich Windows um die Sache was mit dem Aufruf alle 360000 Millisekunden angeht.
Mein Code ist wie folgt aufgebaut:
Code: Alles auswählen
Procedure Hauptprogramm()
...
...
...
EndProcedure
Procedure Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)
Static Init
If Init = #False
Init = #True
EndIf
Select IDEvent
Case 1
Hauptprogramm()
EndSelect
EndProcedure
If OpenWindow(1, 0, 0, 350, 290, "Timer", #PB_Window_ScreenCentered | #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(1))
ButtonGadget(6, 60, 170, 250, 30, "Start")
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
If EventID = #PB_Event_Gadget
If EventGadget()=6
SetTimer_(WindowID(1), 1, 360000, @Zeitschleife())
SetWindowState(1, #PB_Window_Minimize)
EndIf
EndIf
Until Quit=1
KillTimer_(WindowID(1), 1)
EndIf
EndIf
Vielen Dank schon mal im Vorraus.
Verfasst: 16.06.2008 19:31
von ts-soft
So ganz verstehe ich nicht was Du möchtest?
Du kannst natürlich Zeitschleife(...) auch so aufrufen, also z.B. bevor Du den
Timer setzt.
Verfasst: 16.06.2008 20:25
von HemSA
Hallo ts-soft,
Hmm, und ich dachte ich hätte mich richtig ausgedrückt.
Im Hauptprogramm werden Daten aktuallisiert. Der jetztige Ablauf ist so:
==> Nach dem Betätigen vom "Startbutton" tut sich noch nichts was das Hauptprogramm angeht. Das Fenster wird verkleinert
==> Nach 6 Minuten wird das Hauptprogramm zum 1. mal ausgeführt
==> Nach 6 weiteren Minuten wird das Hauptprogramm wieder ausgeführt
==> usw.
Was ich will ist:
==> Nach dem Betätigen vom "Startbutton" wird das Hauptprogramm ausgeführt. Das Fenster wird verkleinert
==> Nach 6 weiteren Minuten wird das Hauptprogramm wieder ausgeführt
==> usw.
Ok, ich kann natürlich auch einen weiteren "Sofortstartbutton" einfügen der direkt das Hauptprogramm aufruft und dann das Programm wieder beendet. Für Testzwecke oder wenn man möchtet, das die Daten sofort akualisiert werden, und nicht erst nach 6 Minuten.
==> Wäre die sichere Lösung, aber vielleicht geht das Ganze auch viel eleganter ohne einen weiteren Button mit einer kleinen Änderung ( 0-1, #False - #True, wie schon gesagt ich kenne mich da, was da in der Procedur Zeitschleife alles passiert nicht aus.
Ein weiterer Versuch wäre vielleicht den Wert "360000" in eine Variable zu packen die im Laufe verändert wird.
==> wäre jetzt einfach Spekulation, und das Programm stürtzt vielleicht nach 8 Stunden ab weil irgendwelche Werte am Überlaufen sind, wenn es überhaupt funktionieren würde.
Verfasst: 16.06.2008 20:29
von Kaeru Gaman
ts meinte nur, dort wo du SetTimer_() aufrufst,
dort kannst du auch gleich schon mal Zeitschleife() aufrufen,
wenn du eine sofortige ausführung willst.
Code: Alles auswählen
If EventGadget()=6
Zeitschleife()
SetTimer_(WindowID(1), 1, 360000, @Zeitschleife())
SetWindowState(1, #PB_Window_Minimize)
EndIf
ein timer ist dazu da, eine verzögerung auszulösen, weil sofort aufrufen kannst du ja eben sofort.
Verfasst: 16.06.2008 20:41
von ts-soft
Ich denke eher, er meint es so ähnlich:
Code: Alles auswählen
Procedure Hauptprogramm()
; ...
; ...
; ...
EndProcedure
Global IsAn.l
Procedure Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)
Static time, init
If IsAn
time + 1000
If (Not init) And (IDEvent = 1) : init = #True : Hauptprogramm() : EndIf
If time>360000
Select IDEvent
Case 1
Hauptprogramm()
EndSelect
time = 0
EndIf
EndIf
EndProcedure
If OpenWindow(1, 0, 0, 350, 290, "Timer", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
If CreateGadgetList(WindowID(1))
ButtonGadget(6, 60, 170, 250, 30, "Start")
SetTimer_(WindowID(1), 1, 1000, @Zeitschleife())
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
If EventID = #PB_Event_Gadget
If EventGadget() = 6
IsAn = #True
SetWindowState(1, #PB_Window_Minimize)
EndIf
EndIf
Until Quit = 1
KillTimer_(WindowID(1), 1)
EndIf
EndIf
so ungefähr jedenfalls könnte es gehen wenns nicht ganz so genau sein soll
Verfasst: 16.06.2008 20:42
von HemSA
Hallo Kaeru Gaman,
Vielen Dank! Ich bin eben auch schon ein alter Mann geworden, wo man manche Sachen nicht sieht, und / oder es über Ecken zu lösen versucht.
TS - dir natürlich auch noch einen Dank, habe dich zu dem Zeitpunkt nicht verstanden, und den Timer habe ich ja von dir übernommen.
Tschüssle
Verfasst: 16.06.2008 21:04
von HemSA
Hallo TS,
da hast du schneller eine Antwort geschrieben als ich darauf geantwortet habe.
Was ich will ist:
==> Nach dem Betätigen vom "Startbutton" wird das Hauptprogramm ausgeführt. Das Fenster wird verkleinert
==> Nach 6 weiteren Minuten wird das Hauptprogramm wieder ausgeführt
==> Nach 6 weiteren Minuten wird das Hauptprogramm wieder ausgeführt
==> usw.
Ich werde es dann mal versuchen, erst mal die Version mit dem Einfügen von:
Zeitschleife()
Wenn es dann nicht so ist wie ich es wollte, dann deine Version. Obwohl ich sagen muss dass es dann wohl auf ein KOPIEREN und EINFÜGEN hinausläuft, weil ich sowas wie dieses:
Code: Alles auswählen
...
If (Not init) And (IDEvent = 1) : init = #True : Hauptprogramm() : EndIf
...
nicht so recht verstehe was da abläuft. Was die Genauigkeit angeht - kein Problem wenn es mal nicht genau 6 Minuten sind.
Verfasst: 16.06.2008 21:13
von Kaeru Gaman
beim code von ts geht es darum, dass der Timer jede Sekunde aufgerufen wird.
beim ersten aufruf, also nach 1 sekunde, und dann immer nach 6:01 minuten wird Hauptprogramm() aufgerufen.
If (Not init) ist das gleiche wie If (init = #False)
IDEvent ist einer der Parameter, die der automatische Callback deiner Procedure übergibt.
was es damit genauer auf sich hat, kann dir besser ts erklären.
@ts
ich würde ja If time >= 360000 schreiben,
oder sogar über ElapsedMilliseconds gehen, um zu verhindern, dass sich Abweichungen aufaddieren können.
Verfasst: 16.06.2008 21:23
von HemSA
Hallo Kaeru Gaman,
und was macht deine Version mit
Code: Alles auswählen
If EventGadget()=6
Zeitschleife()
SetTimer_(WindowID(1), 1, 360000, @Zeitschleife())
SetWindowState(1, #PB_Window_Minimize)
EndIf
Könnte ich statt "Zeitschleife()" - vor dem "SetTimer..." auch nicht gleich "Hauptprogramm()" schreiben?
Verfasst: 16.06.2008 21:30
von ts-soft
HemSA hat geschrieben:Könnte ich statt "Zeitschleife()" - vor dem "SetTimer..." auch nicht gleich "Hauptprogramm()" schreiben?
Wäre sinnvoller und war mein erster Gedanke
