diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index c0980c4..b256ff3 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -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() diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index ed1756d..31f93ba 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -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 diff --git a/setup.py b/setup.py index a5e55c9..1b7c037 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( license="LGPLv3", name="revpimodio2", - version="2.5.3e", + version="2.5.3f", packages=["revpimodio2"], python_requires="~=3.2",