Seite 1 von 1

Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 10:25
von Python86
Hallo Liebe Python-Community,

ich versuche gerade eine Python Funktion zu schreiben welches nach einer vorgegebenen Zeit wiederholt eine oder mehrere Funktionen aufrufen soll. Die Lösung in VBA habe ich bereits, nur leider habe ich es nicht geschafft in Python zu realisieren. Ich arbeiten mit Python 2.6.2

Der VBA Code sieht wie folgt aus:

Code: Alles auswählen

Public Function TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal iTimerID As Long, ByVal dwTime As Long) As Long
  Static lCounter As Long                                          'just for fun, count the loops
  
  KillTimer 0&, iTimer                                              'stop timer
  
  Msgbox "Timer Pausiert"                                'send message
  [b]MeineFunktion[/b]                                              [b]#Funktion die aufgerufen werden soll[/b]


  
  lCounter = lCounter + 1                                          'start with 1
  Debug.Print lCounter                                              'print num of loops
  
  StartTimer                                                        'restart timer
  
End Function

Sub CATMain()
  Dim iDummy As Integer
  
  'if the timer is already running on reentry, then stop the script
  iDummy = GetSetting("TimerTest", "StartStop", "OnOff", 0)        'get timer setting
  If iDummy <> 0 Then                                              'if timer is already running
      KillTimer 0&, iDummy                                          'stop timer
      Msgbox ("Timer Pausiert")                              'send message
      SaveSetting "TimerTest", "StartStop", "OnOff", 0              'set setting to off
      Exit Sub                                                      'quit
      End
End If
  
  StartTimer                                                        'start the timer

End Sub

Sub StartTimer()
  
  iTimer = SetTimer(0&, 0&, 15000, AddressOf TimerProc)            'start timer, alle 15000ms
  
  If iTimer <> 0 Then                                              'is there a timer
      SaveSetting "TimerTest", "StartStop", "OnOff", iTimer          'save setting
       Msgbox ("Timer gestartet")
  Else                                                              'if no timer exists
      MsgBox "Couldn't create timer. Exiting...", _
        vbOKOnly Or vbCritical, "TimerTest_CatMain"                'send message
      'since the timerproc hasn't been initialized, the calling sub simply ends stopping the macro
  End If
  
End Sub
Könnt ihr mir helfen das in Python zu realisieren? Ich bin auf euer Hilfe angewiesen :K

Danke :oops:

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 10:51
von Sirius3
@Python86: dafür kannst Du time.sleep benutzen:

Code: Alles auswählen

import time

while True:
    next_start = time.time() + 15 # in 15s
    meine_funktion()
    time.sleep(max(0, time.time() - next_start)

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 11:11
von BlackJack
@Python86: Ich denke da brauchen wir noch ein wenig mehr Informationen falls Sirius3 mit der offensichtlichen und einfachen Lösung Deine Problemstellung nicht abdeckt. VBA eine andere Sprache in einer ganz anderen Umgebung als Python. Da scheint zum Beispiel GUI dabei zu sein und da hängt es eventuell auch vom verwendeten GUI-Rahmenwerk ab wie man am besten einen zeitgesteuerten Aufruf macht.

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 11:35
von Python86
Sirius3 hat geschrieben:@Python86: dafür kannst Du time.sleep benutzen:

Code: Alles auswählen

import time

while True:
    next_start = time.time() + 15 # in 15s
    meine_funktion()
    time.sleep(max(0, time.time() - next_start)
Vielen Dank für die schnelle Antwort. Die Funktion "meine_funktion()" soll alle 15s aufgerufen werden. Ich habe deinen Vorschlag erprobt. Die Zeiteinstellung wird irgendwie gar nicht berücksichtigt. Es läuft genau so ab wie:

while True:
meine_funktion()

woran liegt das? :K

Danke :roll:

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 11:41
von Python86
BlackJack hat geschrieben:@Python86: Ich denke da brauchen wir noch ein wenig mehr Informationen falls Sirius3 mit der offensichtlichen und einfachen Lösung Deine Problemstellung nicht abdeckt. VBA eine andere Sprache in einer ganz anderen Umgebung als Python. Da scheint zum Beispiel GUI dabei zu sein und da hängt es eventuell auch vom verwendeten GUI-Rahmenwerk ab wie man am besten einen zeitgesteuerten Aufruf macht.

Hallo @BlackJack

Eine GUI ist nicht dabei. Die Funktion die ich in VBA aufrufe koppelt sich mit einem CAD-Programm und überprüft Bauteile.

Grüße :roll:

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 11:49
von Python86
Python86 hat geschrieben:
Sirius3 hat geschrieben:@Python86: dafür kannst Du time.sleep benutzen:

Code: Alles auswählen

import time

while True:
    next_start = time.time() + 15 # in 15s
    meine_funktion()
    time.sleep(max(0, time.time() - next_start)
Vielen Dank für die schnelle Antwort. Die Funktion "meine_funktion()" soll alle 15s aufgerufen werden. Ich habe deinen Vorschlag erprobt. Die Zeiteinstellung wird irgendwie gar nicht berücksichtigt. Es läuft genau so ab wie:

while True:
meine_funktion()

woran liegt das? :K

Danke :roll:

So klappt es:

while True:

meine_funktion()
time.sleep(15)


Nur Python hängt sich dann auf. Wie könnte ich einen Pause- oder Stopfunktion realisieren?

Dankee :roll:

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 11:52
von bwbg

Code: Alles auswählen

time.sleep(max(0, time.time() - next_start)
Evaluiert in den meisten Fällen zu 0 und daher wird die Schleife praktisch nie pausiert (next_start ist meist größer als time.time()).

Richtig wäre

Code: Alles auswählen

time.sleep(max(0, next_start - time.time()
Deine "funktionierende" Lösung zieht nicht in Betracht, dass die Funktion durchaus mehrere Sekunden laufen könnte. Die Funktion würde so alle 15 Sekunden + Laufzeit der Funktion aufgerufen werden.

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 12:19
von Python86
Hallo nochmals vielen Dank an alle. Kann ich irgendwie eine Pausen- oder Stopfunktion einfügen. Wenn ich das Programm laufen lasse kann ich es nur mit dem Taskmanager beenden. :K

Vielen Dank :roll:

Re: Python Funktion zum Aufruf von Funktionen mit Timer

Verfasst: Donnerstag 9. Juli 2015, 13:08
von BlackJack
@Python86: Wenn nur Abbrechen gefragt ist dann löst man das bei Terminalanwendungen ja oft über das entsprechende Signal das man mit einer Tastenkombination auslösen kann, also Strg+C unter Linux/Unix oder Strg+Z unter Windows. Das kann man in Python dann über die `KeyboradInterrupt`-Ausnahme behandeln.

Wenn man Start und Stop innerhalb des Programms braucht könnte man das regelmässige Aufrufen in einen eigenen Thread verlegen und über Objekte mit den entsprechenden Typen aus dem `threading`-Modul zwischen beiden Threads kommunizieren bzw. eine (oder mehrere) `Queue.Queue`-Objekte dafür verwenden.