mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 13:53:53 +01:00
Add blocking parameter to .cycleloop
If you want to use a cycleloop function and your own tasks, you can set blocking=False in .cycleloop(...) call. Same as .mainloop(...) call.
This commit is contained in:
@@ -4,6 +4,7 @@ import queue
|
||||
import warnings
|
||||
from math import ceil
|
||||
from threading import Event, Lock, Thread
|
||||
from time import sleep
|
||||
from timeit import default_timer
|
||||
|
||||
from revpimodio2 import BOTH, FALLING, RISING
|
||||
@@ -602,8 +603,8 @@ class ProcimgWriter(Thread):
|
||||
self._eventq.put(tup_fire, False)
|
||||
del self.__dict_delay[tup_fire]
|
||||
|
||||
# Refresh abwarten
|
||||
self._work.wait(self._adjwait)
|
||||
# Sleep and not .wait (.wait uses system clock)
|
||||
sleep(self._adjwait)
|
||||
|
||||
# Wartezeit anpassen um echte self._refresh zu erreichen
|
||||
mrk_dt = default_timer()
|
||||
|
||||
@@ -678,7 +678,7 @@ class RevPiModIO(object):
|
||||
self._exit_level |= 2
|
||||
self.exit(full=True)
|
||||
|
||||
def cycleloop(self, func, cycletime=50):
|
||||
def cycleloop(self, func, cycletime=50, blocking=True):
|
||||
"""
|
||||
Startet den Cycleloop.
|
||||
|
||||
@@ -705,6 +705,7 @@ class RevPiModIO(object):
|
||||
|
||||
:param func: Funktion, die ausgefuehrt werden soll
|
||||
:param cycletime: Zykluszeit in Millisekunden - Standardwert 50 ms
|
||||
:param blocking: Wenn False, blockiert das Programm hier NICHT
|
||||
:return: None or the return value of the cycle function
|
||||
"""
|
||||
# Prüfen ob ein Loop bereits läuft
|
||||
@@ -726,6 +727,16 @@ class RevPiModIO(object):
|
||||
"registered function '{0}' ist not callable".format(func)
|
||||
)
|
||||
|
||||
# Thread erstellen, wenn nicht blockieren soll
|
||||
if not blocking:
|
||||
self._th_mainloop = Thread(
|
||||
target=self.cycleloop,
|
||||
args=(func,),
|
||||
kwargs={"cycletime": cycletime, "blocking": True}
|
||||
)
|
||||
self._th_mainloop.start()
|
||||
return
|
||||
|
||||
# Zykluszeit übernehmen
|
||||
old_cycletime = self._imgwriter.refresh
|
||||
if not cycletime == self._imgwriter.refresh:
|
||||
@@ -777,11 +788,13 @@ class RevPiModIO(object):
|
||||
except Exception as ex:
|
||||
if self._imgwriter.lck_refresh.locked():
|
||||
self._imgwriter.lck_refresh.release()
|
||||
self.exit(full=False)
|
||||
if self._th_mainloop is None:
|
||||
self.exit(full=False)
|
||||
e = ex
|
||||
finally:
|
||||
# Cycleloop beenden
|
||||
self._looprunning = False
|
||||
self._th_mainloop = None
|
||||
|
||||
# Alte autorefresh Zeit setzen
|
||||
self._imgwriter.refresh = old_cycletime
|
||||
|
||||
Reference in New Issue
Block a user