From b16af483dca34d1a0ecfe566d50a36f9b41ff988 Mon Sep 17 00:00:00 2001 From: NaruX Date: Sat, 2 Dec 2017 14:36:04 +0100 Subject: [PATCH] =?UTF-8?q?Eigene=20EventQueue=20f=C3=BCr=20Threads,=20um?= =?UTF-8?q?=20diese=20direkt=20zu=20starten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.helper.html | 9 +++++++ revpimodio2/helper.py | 53 ++++++++++++++++++++++++++++++------- revpimodio2/modio.py | 10 ++----- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/doc/revpimodio2.helper.html b/doc/revpimodio2.helper.html index 8907d61..c1c26d0 100644 --- a/doc/revpimodio2.helper.html +++ b/doc/revpimodio2.helper.html @@ -443,6 +443,9 @@ Methods __check_change Findet Aenderungen fuer die Eventueberwachung. +__exec_th +Fuehrt Events aus, die als Thread registriert wurden. + _collect_events Aktiviert oder Deaktiviert die Eventueberwachung. @@ -493,6 +496,12 @@ ProcimgWriter.__check_change __check_change(dev)

Findet Aenderungen fuer die Eventueberwachung. +

+

+ProcimgWriter.__exec_th

+__exec_th() +

+Fuehrt Events aus, die als Thread registriert wurden.

ProcimgWriter._collect_events

diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 151ce30..bca9ef2 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -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() diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index b974995..f88cce0 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -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)