From bc8a13da1badb5329d81328da107b55dbc3eb9bf Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Sun, 24 Oct 2021 10:50:42 +0200 Subject: [PATCH] Warn the user faster, if the cycle time is exhausted --- revpimodio2/__init__.py | 2 +- revpimodio2/helper.py | 13 +++++++++---- setup.py | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/revpimodio2/__init__.py b/revpimodio2/__init__.py index 488ff35..6773474 100644 --- a/revpimodio2/__init__.py +++ b/revpimodio2/__init__.py @@ -22,7 +22,7 @@ __author__ = "Sven Sager " __copyright__ = "Copyright (C) 2020 Sven Sager" __license__ = "LGPLv3" __name__ = "revpimodio2" -__version__ = "2.5.8b" +__version__ = "2.5.8c" # Global package values OFF = 0 diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 4ca4056..880e51e 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -512,6 +512,7 @@ class ProcimgWriter(Thread): """Startet die automatische Prozessabbildsynchronisierung.""" fh = self._modio._create_myfh() + mrk_delay = self._refresh mrk_warn = True bytesbuff = bytearray(self._modio._length) @@ -521,13 +522,14 @@ class ProcimgWriter(Thread): while not self._work.is_set(): ot = default_timer() - # Lockobjekt holen und Fehler werfen, wenn nicht schnell genug - if not self.lck_refresh.acquire(timeout=self._refresh): + # At this point, we slept and have the rest of delay from last cycle + if not self.lck_refresh.acquire(timeout=mrk_delay): warnings.warn( - "cycle time of {0} ms exceeded during executing function" + "cycle time of {0} ms exceeded in your cycle function" "".format(int(self._refresh * 1000)), RuntimeWarning ) + mrk_delay = self._refresh # Nur durch cycleloop erreichbar - keine verzögerten Events continue @@ -609,15 +611,18 @@ class ProcimgWriter(Thread): self._eventq.put(tup_fire, False) del self.__dict_delay[tup_fire] + mrk_delay = default_timer() % self._refresh + # Second default_timer call include calculation time from above if default_timer() - ot > self._refresh: warnings.warn( "cycle time of {0} ms exceeded - can not hold cycle time!" "".format(int(self._refresh * 1000)), RuntimeWarning ) + mrk_delay = 0.0 else: # Sleep and not .wait (.wait uses system clock) - sleep(self._refresh - (default_timer() % self._refresh)) + sleep(self._refresh - mrk_delay) # Alle am Ende erneut aufwecken self._collect_events(False) diff --git a/setup.py b/setup.py index 5e9f6ff..c8c704c 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( license="LGPLv3", name="revpimodio2", - version="2.5.8b", + version="2.5.8c", packages=["revpimodio2"], python_requires="~=3.2",