Seite 2 von 2

Verfasst: 16.06.2008 22:14
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.

Verfasst: 16.06.2008 23:19
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.

Verfasst: 16.06.2008 23:33
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.

Verfasst: 17.06.2008 19:36
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.

Verfasst: 17.06.2008 19:51
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:

Verfasst: 17.06.2008 20:29
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 :-)

Verfasst: 17.06.2008 20:37
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: