Eigene EventQueue für Threads, um diese direkt zu starten

This commit is contained in:
2017-12-02 14:36:04 +01:00
parent 8b0e465205
commit b16af483dc
3 changed files with 55 additions and 17 deletions

View File

@@ -443,6 +443,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#ProcimgWriter.__check_change">__check_change</a></td>
<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>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgWriter._collect_events">_collect_events</a></td>
<td>Aktiviert oder Deaktiviert die Eventueberwachung.</td>
</tr><tr>
@@ -493,6 +496,12 @@ ProcimgWriter.__check_change</h3>
<b>__check_change</b>(<i>dev</i>)
<p>
Findet Aenderungen fuer die Eventueberwachung.
</p><a NAME="ProcimgWriter.__exec_th" ID="ProcimgWriter.__exec_th"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgWriter.__exec_th</h3>
<b>__exec_th</b>(<i></i>)
<p>
Fuehrt Events aus, die als Thread registriert wurden.
</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,6 +284,8 @@ class ProcimgWriter(Thread):
@param parentmodio Parent Object"""
super().__init__()
self.__dict_delay = {}
self.__eventth = None
self.__eventqth = queue.Queue()
self.__eventwork = False
self._adjwait = 0
self._eventq = queue.Queue()
@@ -323,10 +325,16 @@ class ProcimgWriter(Thread):
or regfunc[1] == RISING and boolor \
or regfunc[1] == FALLING and not boolor:
if regfunc[3] == 0:
self._eventq.put(
(regfunc, io_event._name, io_event.value),
False
)
if regfunc[2]:
self.__eventqth.put(
(regfunc, io_event._name, io_event.value),
False
)
else:
self._eventq.put(
(regfunc, io_event._name, io_event.value),
False
)
else:
# Verzögertes Event in dict einfügen
tupfire = (
@@ -339,10 +347,16 @@ class ProcimgWriter(Thread):
else:
for regfunc in dev._dict_events[io_event]:
if regfunc[3] == 0:
self._eventq.put(
(regfunc, io_event._name, io_event.value),
False
)
if regfunc[2]:
self.__eventqth.put(
(regfunc, io_event._name, io_event.value),
False
)
else:
self._eventq.put(
(regfunc, io_event._name, io_event.value),
False
)
else:
# Verzögertes Event in dict einfügen
tupfire = (
@@ -356,6 +370,19 @@ class ProcimgWriter(Thread):
# Nach Verarbeitung aller IOs die Bytes kopieren (Lock ist noch drauf)
dev._ba_datacp = dev._ba_devdata[:]
def __exec_th(self):
"""Fuehrt Events aus, die als Thread registriert wurden."""
while self.__eventwork:
try:
tup_fireth = self.__eventqth.get(timeout=1)
th = EventCallback(
tup_fireth[0][0], tup_fireth[1], tup_fireth[2]
)
th.start()
# TODO: Error handling
except queue.Empty:
pass
def _collect_events(self, value):
"""Aktiviert oder Deaktiviert die Eventueberwachung.
@param value True aktiviert / False deaktiviert"""
@@ -365,8 +392,12 @@ class ProcimgWriter(Thread):
if self.__eventwork != value:
with self.lck_refresh:
self.__eventwork = value
self.__eventqth = queue.Queue()
self._eventq = queue.Queue()
self.__dict_delay = {}
if value:
self.__eventth = Thread(target=self.__exec_th)
self.__eventth.start()
def _get_ioerrors(self):
"""Ruft aktuelle Anzahl der Fehler ab.
@@ -469,7 +500,10 @@ class ProcimgWriter(Thread):
self.__dict_delay[tup_fire] -= 1
if self.__dict_delay[tup_fire] <= 0:
# Verzögertes Event übernehmen und löschen
self._eventq.put(tup_fire, False)
if tup_fire[0][2]:
self.__eventqth.put(tup_fire, False)
else:
self._eventq.put(tup_fire, False)
del self.__dict_delay[tup_fire]
# Refresh abwarten
@@ -490,6 +524,7 @@ class ProcimgWriter(Thread):
self._adjwait += 0.001
# Alle am Ende erneut aufwecken
self._collect_events(False)
self.newdata.set()
fh.close()

View File

@@ -539,14 +539,8 @@ class RevPiModIO(object):
while not self._exit.is_set():
try:
tup_fire = self._imgwriter._eventq.get(timeout=1)
if tup_fire[0][2]:
th = helpermodule.EventCallback(
tup_fire[0][0], tup_fire[1], tup_fire[2]
)
th.start()
else:
# Direct callen da Prüfung in io.IOBase.reg_event ist
tup_fire[0][0](tup_fire[1], tup_fire[2])
# Direct callen da Prüfung in io.IOBase.reg_event ist
tup_fire[0][0](tup_fire[1], tup_fire[2])
except Empty:
if not self._exit.is_set() and not self._imgwriter.is_alive():
self.exit(full=False)