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:
2020-12-14 19:50:48 +01:00
parent 4ac1283c5b
commit 6beb05577e
3 changed files with 19 additions and 5 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -17,7 +17,7 @@ setup(
license="LGPLv3",
name="revpimodio2",
version="2.5.3e",
version="2.5.3f",
packages=["revpimodio2"],
python_requires="~=3.2",