"Sofortstart" vom Timer

Anfängerfragen zum Programmieren mit PureBasic.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

"Sofortstart" vom Timer

Beitrag 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.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag 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.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag 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
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag 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.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag 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?
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten