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 import warnings
from math import ceil from math import ceil
from threading import Event, Lock, Thread from threading import Event, Lock, Thread
from time import sleep
from timeit import default_timer from timeit import default_timer
from revpimodio2 import BOTH, FALLING, RISING from revpimodio2 import BOTH, FALLING, RISING
@@ -602,8 +603,8 @@ class ProcimgWriter(Thread):
self._eventq.put(tup_fire, False) self._eventq.put(tup_fire, False)
del self.__dict_delay[tup_fire] del self.__dict_delay[tup_fire]
# Refresh abwarten # Sleep and not .wait (.wait uses system clock)
self._work.wait(self._adjwait) sleep(self._adjwait)
# Wartezeit anpassen um echte self._refresh zu erreichen # Wartezeit anpassen um echte self._refresh zu erreichen
mrk_dt = default_timer() mrk_dt = default_timer()

View File

@@ -678,7 +678,7 @@ class RevPiModIO(object):
self._exit_level |= 2 self._exit_level |= 2
self.exit(full=True) self.exit(full=True)
def cycleloop(self, func, cycletime=50): def cycleloop(self, func, cycletime=50, blocking=True):
""" """
Startet den Cycleloop. Startet den Cycleloop.
@@ -705,6 +705,7 @@ class RevPiModIO(object):
:param func: Funktion, die ausgefuehrt werden soll :param func: Funktion, die ausgefuehrt werden soll
:param cycletime: Zykluszeit in Millisekunden - Standardwert 50 ms :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 :return: None or the return value of the cycle function
""" """
# Prüfen ob ein Loop bereits läuft # Prüfen ob ein Loop bereits läuft
@@ -726,6 +727,16 @@ class RevPiModIO(object):
"registered function '{0}' ist not callable".format(func) "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 # Zykluszeit übernehmen
old_cycletime = self._imgwriter.refresh old_cycletime = self._imgwriter.refresh
if not cycletime == self._imgwriter.refresh: if not cycletime == self._imgwriter.refresh:
@@ -777,11 +788,13 @@ class RevPiModIO(object):
except Exception as ex: except Exception as ex:
if self._imgwriter.lck_refresh.locked(): if self._imgwriter.lck_refresh.locked():
self._imgwriter.lck_refresh.release() self._imgwriter.lck_refresh.release()
if self._th_mainloop is None:
self.exit(full=False) self.exit(full=False)
e = ex e = ex
finally: finally:
# Cycleloop beenden # Cycleloop beenden
self._looprunning = False self._looprunning = False
self._th_mainloop = None
# Alte autorefresh Zeit setzen # Alte autorefresh Zeit setzen
self._imgwriter.refresh = old_cycletime self._imgwriter.refresh = old_cycletime

View File

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