mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
Moved call of cleanupfunc to exit jobs, wait mainloop end on thread (blocking=False).
close #4
This commit is contained in:
@@ -137,12 +137,8 @@ class RevPiModIO(object):
|
|||||||
"""
|
"""
|
||||||
signal(SIGINT, SIG_DFL)
|
signal(SIGINT, SIG_DFL)
|
||||||
signal(SIGTERM, SIG_DFL)
|
signal(SIGTERM, SIG_DFL)
|
||||||
|
self._exit_level |= 4
|
||||||
self.exit(full=True)
|
self.exit(full=True)
|
||||||
if self.__cleanupfunc is not None:
|
|
||||||
self.readprocimg()
|
|
||||||
self.__cleanupfunc()
|
|
||||||
if not self._monitoring:
|
|
||||||
self.writeprocimg()
|
|
||||||
|
|
||||||
def __exit_jobs(self):
|
def __exit_jobs(self):
|
||||||
"""Shutdown sub systems."""
|
"""Shutdown sub systems."""
|
||||||
@@ -162,6 +158,14 @@ class RevPiModIO(object):
|
|||||||
if not self._monitoring:
|
if not self._monitoring:
|
||||||
self.writeprocimg(dev)
|
self.writeprocimg(dev)
|
||||||
|
|
||||||
|
# Execute clean up function
|
||||||
|
if self._exit_level & 4 and self.__cleanupfunc is not None:
|
||||||
|
self._exit_level ^= 4
|
||||||
|
self.readprocimg()
|
||||||
|
self.__cleanupfunc()
|
||||||
|
if not self._monitoring:
|
||||||
|
self.writeprocimg()
|
||||||
|
|
||||||
if self._exit_level & 2:
|
if self._exit_level & 2:
|
||||||
self._myfh.close()
|
self._myfh.close()
|
||||||
self.app = None
|
self.app = None
|
||||||
@@ -725,15 +729,12 @@ class RevPiModIO(object):
|
|||||||
while ec is None and not cycleinfo.last:
|
while ec is None and not cycleinfo.last:
|
||||||
# Auf neue Daten warten und nur ausführen wenn set()
|
# Auf neue Daten warten und nur ausführen wenn set()
|
||||||
if not self._imgwriter.newdata.wait(2.5):
|
if not self._imgwriter.newdata.wait(2.5):
|
||||||
if not self._imgwriter.is_alive():
|
self.exit(full=False)
|
||||||
self.exit(full=False)
|
if self._imgwriter.is_alive():
|
||||||
|
e = RuntimeError("no new io data in cycle loop")
|
||||||
|
else:
|
||||||
e = RuntimeError("autorefresh thread not running")
|
e = RuntimeError("autorefresh thread not running")
|
||||||
break
|
break
|
||||||
|
|
||||||
# Abfragen um loop bei exit zu verlassen
|
|
||||||
cycleinfo.last = self._exit.is_set()
|
|
||||||
|
|
||||||
continue
|
|
||||||
self._imgwriter.newdata.clear()
|
self._imgwriter.newdata.clear()
|
||||||
|
|
||||||
# Vor Aufruf der Funktion autorefresh sperren
|
# Vor Aufruf der Funktion autorefresh sperren
|
||||||
@@ -791,6 +792,10 @@ class RevPiModIO(object):
|
|||||||
self._exit.set()
|
self._exit.set()
|
||||||
self._waitexit.set()
|
self._waitexit.set()
|
||||||
|
|
||||||
|
# Auf beenden von mainloop thread warten
|
||||||
|
if self._th_mainloop is not None and self._th_mainloop.is_alive():
|
||||||
|
self._th_mainloop.join(2.5)
|
||||||
|
|
||||||
if full:
|
if full:
|
||||||
self.__exit_jobs()
|
self.__exit_jobs()
|
||||||
|
|
||||||
@@ -1003,24 +1008,26 @@ class RevPiModIO(object):
|
|||||||
)
|
)
|
||||||
except Empty:
|
except Empty:
|
||||||
if not self._exit.is_set() and not self._imgwriter.is_alive():
|
if not self._exit.is_set() and not self._imgwriter.is_alive():
|
||||||
self.exit(full=False)
|
|
||||||
e = RuntimeError("autorefresh thread not running")
|
e = RuntimeError("autorefresh thread not running")
|
||||||
|
break
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
self.exit(full=False)
|
|
||||||
e = ex
|
e = ex
|
||||||
|
break
|
||||||
|
|
||||||
# Mainloop verlassen
|
# Mainloop verlassen
|
||||||
self._imgwriter._collect_events(False)
|
self._imgwriter._collect_events(False)
|
||||||
self._looprunning = False
|
self._looprunning = False
|
||||||
self._th_mainloop = None
|
self._th_mainloop = None
|
||||||
|
|
||||||
# Exitstrategie ausführen
|
|
||||||
self.__exit_jobs()
|
|
||||||
|
|
||||||
# Auf Fehler prüfen die im loop geworfen wurden
|
# Auf Fehler prüfen die im loop geworfen wurden
|
||||||
if e is not None:
|
if e is not None:
|
||||||
|
self.exit(full=False)
|
||||||
|
self.__exit_jobs()
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
# Exitstrategie ausführen
|
||||||
|
self.__exit_jobs()
|
||||||
|
|
||||||
def readprocimg(self, device=None) -> bool:
|
def readprocimg(self, device=None) -> bool:
|
||||||
"""
|
"""
|
||||||
Einlesen aller Inputs aller/eines Devices vom Prozessabbild.
|
Einlesen aller Inputs aller/eines Devices vom Prozessabbild.
|
||||||
|
|||||||
Reference in New Issue
Block a user