__exec_th als daemon starten

Devices zum autorefresh hinzufügen abgesichert mit Lock
This commit is contained in:
2017-12-03 15:00:47 +01:00
parent 691bbee0bc
commit 35a10fc53e
4 changed files with 14 additions and 4 deletions

View File

@@ -444,7 +444,7 @@ Methods</h3>
<td>Findet Aenderungen fuer die Eventueberwachung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgWriter.__exec_th">__exec_th</a></td>
<td>Fuehrt Events aus, die als Thread registriert wurden.</td>
<td>Laeuft als Thread, der Events als Thread startet.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgWriter._collect_events">_collect_events</a></td>
<td>Aktiviert oder Deaktiviert die Eventueberwachung.</td>
@@ -501,7 +501,7 @@ Findet Aenderungen fuer die Eventueberwachung.
ProcimgWriter.__exec_th</h3>
<b>__exec_th</b>(<i></i>)
<p>
Fuehrt Events aus, die als Thread registriert wurden.
Laeuft als Thread, der Events als Thread startet.
</p><a NAME="ProcimgWriter._collect_events" ID="ProcimgWriter._collect_events"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgWriter._collect_events</h3>

View File

@@ -284,7 +284,10 @@ class Device(object):
self._filelock.release()
self._selfupdate = True
self._modio._lst_refresh.append(self)
# Sicher in Liste einfügen
with self._modio._imgwriter.lck_refresh:
self._modio._lst_refresh.append(self)
# Thread starten, wenn er noch nicht läuft
if not self._modio._imgwriter.is_alive():

View File

@@ -373,7 +373,7 @@ class ProcimgWriter(Thread):
dev._ba_datacp = dev._ba_devdata[:]
def __exec_th(self):
"""Fuehrt Events aus, die als Thread registriert wurden."""
"""Laeuft als Thread, der Events als Thread startet."""
while self.__eventwork:
try:
tup_fireth = self.__eventqth.get(timeout=1)
@@ -400,6 +400,7 @@ class ProcimgWriter(Thread):
# Threadmanagement
if value and not self.__eventth.is_alive():
self.__eventth = Thread(target=self.__exec_th)
self.__eventth.daemon = True
self.__eventth.start()
def _get_ioerrors(self):

View File

@@ -414,12 +414,18 @@ class RevPiModIO(object):
@param full Entfernt auch alle Devices aus autorefresh"""
self._exit.set()
self._waitexit.set()
if full:
# ProcimgWriter beenden und darauf warten
if self._imgwriter is not None and self._imgwriter.is_alive():
self._imgwriter.stop()
self._imgwriter.join(self._imgwriter._refresh)
# Mainloop beenden und darauf waretn
if self._th_mainloop is not None and self._th_mainloop.is_alive():
self._th_mainloop.join(1)
# Alle Devices aus Autorefresh entfernen
while len(self._lst_refresh) > 0:
dev = self._lst_refresh.pop()
dev._selfupdate = False