"Sofortstart" vom Timer

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ts-soft hat geschrieben:
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:
die frage war, wie man den timer mit sofortstart auslöst...
deine Zeitschleife() besitzt auch eine Art Initialisierung:

Code: Alles auswählen

  If Init = #False
     Init = #True
  EndIf 
wenn du also nur Hauptprogramm() aufrufst, ist Zeitschleife() beim Aufruf 6min. später noch nicht initialisiert...

wenn schon, denn schon, gelle?

ist in diesem Fall zwar noch nicht wichtig, aber wenn bei der Initialisierung noch mehr dazukommen sollte, wird es wichtig.
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 »

Danke noch mal an euch beiden,
ich werde das jetzt erst mal probieren. Die Timergeschichte wird für mich wohl immer ein Rätsel bleiben was die tiefen Hintergründe im Windowssystem angeht.

Was ich genau will habe ich ja mehrmals beschrieben.

Ich habe auch keine Ahnung was es mit diesem Teil auf sich hat und was da passiert:

Code: Alles auswählen

  If Init = #False
     Init = #True
  EndIf

Wenn ich statt "Zeitschleife()" - vor dem "SetTimer..." "Hauptprogramm()" schreiben würde. Würde dann das Programm nach der Prozedur Hauptprogramm() nicht an dieser Stelle weitermachen?

Code: Alles auswählen

SetTimer_(WindowID(1), 1, 360000, @Zeitschleife())
....
und somit dann auch dieser Teil ausgeführt werden

Code: Alles auswählen

  If Init = #False
     Init = #True
  EndIf
?

Nun denn - ist wohl um diese Zeit etwas schwer für mich das alles zu begreifen, da ich z.B. auch noch nie was mit Callback gemacht habe, was ich wohl in dieser Timergeschichte unbewusst anwende.

Tschüssle, und wenn ich noch Fragen habe werde ich mich melden.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ich habe auch keine Ahnung was es mit diesem Teil auf sich hat und was da passiert:

der stammt aus deinem code... hast du den irgendwo her kopiert? :mrgreen:

das ist ein statisches Flag, das registriert, ob die Procedure zum ersten Mal aufgerufen wird.
Wenn es der erste Aufruf ist, hat die Variable "Init" der Wert Null, weil sie gerade erst erzeugt wurde.
Null ist gleichbedeutend mit #False.
wenn das der Fall ist, wird sie auf #True gesetzt, bekommt also einen Wert.
weil sie als "Static" also statisch deklariert ist, bleibt sie nach beenden der Proc erhalten.
damit ist sie beim nächsten Aufruf der Proc nicht mehr Null.
das kann man nun Nutzen, um innerhalb dieses If-Zweiges Code einzubaun,
der Nur beim allerersten Aufruf ausgeführt werden soll, also eine Initialisierung eben.

> Würde dann das Programm nach der Prozedur Hauptprogramm() nicht an dieser Stelle weitermachen?
doch natürlich, der Timer wird dann gesetzt.

> und somit dann auch dieser Teil ausgeführt werden
nein, eben erst 6min später, und deshalb hast du ja überhaupt gefragt,
weil eine Timer routine erst nach ablauf des Timers ausgelöst wird, auch das erste mal.
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,
erst mal Danke für deine Erklärung und Erläuterung zu der Sache.

Ja den Code habe ich vom TS kopiert ==> Suchfunktion hilft

Allerdings klappt es so wie du es gemeind hast nicht so richtig.
Hier ist der Code ( habe zur Kontrolle nur die "Debug "Ausführung vom Hauptprogramm"" Zeile eingefügt):

Code: Alles auswählen

Procedure Hauptprogramm()
 
  Debug "Ausführung vom 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
         ;Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)
         Hauptprogramm()
         SetTimer_(WindowID(1), 1, 15000, @Zeitschleife())
         SetWindowState(1, #PB_Window_Minimize)
      EndIf
    
       
    EndIf
   
    Until Quit=1


    KillTimer_(WindowID(1), 1)
  EndIf
EndIf

Wenn ich "Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)" vor SetTimer .. einfüge ( Zeitschleife() gibt eine Fehlermeldung aus ) und das Programm starte läuft es genauso ab wie sonst:

==> Programm starten
==> Fenster minimert sich und 15 Sekunden tut sich nichts
==> Nach 15 Sekunden die 1. Ausgabe vom Hauptprogramm
==> Nach weiteren 15 Sekunden die 2. Ausgabe vom Hauptprogramm
==> usw.

Wenn ich allerdings statt "Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)" "Hauptprogramm()" angebe, dann läuft es so ab wie ich es wollte:

==> Programm starten
==> 1. Ausgabe vom Hauptprogramm und Fenster minimert sich
==> Nach 15 Sekunden die 2. Ausgabe vom Hauptprogramm
==> Nach weiteren 15 Sekunden die 3. Ausgabe vom Hauptprogramm
==> usw.

Nochmal ein Dankeschön an euch beiden.
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 »

Code: Alles auswählen

Procedure Hauptprogramm()
 
  Debug "Ausführung vom Hauptprogramm"

EndProcedure


Procedure Zeitschleife(hWnd.l, uMsg, IDEvent, dwTime)

  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
         Zeitschleife(0, 0, 1, 0)
         ;Hauptprogramm()
         SetTimer_(WindowID(1), 1, 15000, @Zeitschleife())
         SetWindowState(1, #PB_Window_Minimize)
      EndIf
   
       
    EndIf
   
    Until Quit=1


    KillTimer_(WindowID(1), 1)
  EndIf
EndIf 
Unnötiges entfernt.
In dem Aufruf von Zeitschleife ist doch IDEvent auf 1 zu setzen,
ansonsten greift Dein Select nicht :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
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo TS,
danke für deine Mühe die du dir gemacht hast.

Das man diesen Teil rausschmeissen soll wurde gestern ja nicht gesagt:

Code: Alles auswählen

Static Init
  If Init = #False
     Init = #True
  EndIf

Ja so funktioniert es auch so wie ich es wollte.

Habe eine Frage: Spricht was gegen die Lösung die ich gemacht habe ( mit Hauptprogramm() ) - sind irgendwelche Gefahren vorhanden?

Von den Werten "hWnd.l, uMsg, IDEvent, dwTime" wo ich ehh keine Ahnung habe für was die verantwortlich sind - was natürlich auch auf meine Lösung zutrifft - "kopieren und einsetzen :-) " - ist nicht so meine Art.
In dem Aufruf von Zeitschleife ist doch IDEvent auf 1 zu setzen,
ansonsten greift Dein Select nicht Wink
Als Ergebnis kommt dann solches raus :-)
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: Habe eine Frage: Spricht was gegen die Lösung die ich gemacht habe ( mit Hauptprogramm() ) - sind irgendwelche Gefahren vorhanden?
Nein, würde ich so machen :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