mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 13:53:53 +01:00
Eigene EventQueue für Threads, um diese direkt zu starten
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user