Bugfix: prefire mit as_thread hatte Fehler bei Übergabe in Queue

Netzwerkklassen zeigen über .config_changed an, dass Neuinstanzierung nötig ist
_connect von NetFH löst ConfigChanged-Exception aus
This commit is contained in:
2019-08-20 09:36:19 +02:00
parent 2d17e6f1fa
commit d61d76b6f3
5 changed files with 73 additions and 16 deletions

View File

@@ -122,7 +122,7 @@ Thread
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>__slots__</td></tr><tr><td>closed</td></tr><tr><td>name</td></tr><tr><td>reconnecting</td></tr><tr><td>timeout</td></tr>
<tr><td>__slots__</td></tr><tr><td>closed</td></tr><tr><td>config_changed</td></tr><tr><td>name</td></tr><tr><td>reconnecting</td></tr><tr><td>timeout</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
@@ -163,6 +163,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#NetFH.get_closed">get_closed</a></td>
<td>Pruefen ob Verbindung geschlossen ist.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#NetFH.get_config_changed">get_config_changed</a></td>
<td>Pruefen ob RevPi Konfiguration geaendert wurde.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#NetFH.get_name">get_name</a></td>
<td>Verbindugnsnamen zurueckgeben.</td>
</tr><tr>
@@ -307,6 +310,17 @@ Pruefen ob Verbindung geschlossen ist.
<dd>
True, wenn Verbindung geschlossen ist
</dd>
</dl><a NAME="NetFH.get_config_changed" ID="NetFH.get_config_changed"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
NetFH.get_config_changed</h3>
<b>get_config_changed</b>(<i></i>)
<p>
Pruefen ob RevPi Konfiguration geaendert wurde.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn RevPi Konfiguration geaendert ist
</dd>
</dl><a NAME="NetFH.get_name" ID="NetFH.get_name"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
NetFH.get_name</h3>
@@ -484,7 +498,7 @@ _RevPiModIO
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>__slots__</td></tr><tr><td>reconnecting</td></tr>
<tr><td>__slots__</td></tr><tr><td>config_changed</td></tr><tr><td>reconnecting</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
@@ -510,6 +524,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiNetIO.exit">exit</a></td>
<td>Beendet mainloop() und optional autorefresh.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiNetIO.get_config_changed">get_config_changed</a></td>
<td>Pruefen ob RevPi Konfiguration geaendert wurde.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiNetIO.get_jconfigrsc">get_jconfigrsc</a></td>
<td>Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.</td>
</tr><tr>
@@ -595,6 +612,20 @@ Beendet mainloop() und optional autorefresh.
<dd>
<a style="color:#0000FF" href="#RevPiModIO.exit(...)">#RevPiModIO.exit(...)</a>
</dd>
</dl><a NAME="RevPiNetIO.get_config_changed" ID="RevPiNetIO.get_config_changed"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiNetIO.get_config_changed</h3>
<b>get_config_changed</b>(<i></i>)
<p>
Pruefen ob RevPi Konfiguration geaendert wurde.
</p><p>
In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss
neu instanziert werden.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn RevPi Konfiguration geaendert ist
</dd>
</dl><a NAME="RevPiNetIO.get_jconfigrsc" ID="RevPiNetIO.get_jconfigrsc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiNetIO.get_jconfigrsc</h3>
@@ -612,6 +643,9 @@ RevPiNetIO.get_reconnecting</h3>
<b>get_reconnecting</b>(<i></i>)
<p>
Interner reconnect aktiv wegen Netzwerkfehlern.
</p><p>
Das Modul versucht intern die Verbindung neu herzustellen. Es ist
kein weiteres Zutun noetig.
</p><dl>
<dt>Returns:</dt>
<dd>

View File

@@ -190,8 +190,10 @@ revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count)
revpimodio2.netio.NetFH.clear_dirtybytes?4(position=None)
revpimodio2.netio.NetFH.close?4()
revpimodio2.netio.NetFH.closed?7
revpimodio2.netio.NetFH.config_changed?7
revpimodio2.netio.NetFH.flush?4()
revpimodio2.netio.NetFH.get_closed?4()
revpimodio2.netio.NetFH.get_config_changed?4()
revpimodio2.netio.NetFH.get_name?4()
revpimodio2.netio.NetFH.get_reconnecting?4()
revpimodio2.netio.NetFH.get_timeout?4()
@@ -211,8 +213,10 @@ revpimodio2.netio.NetFH.write?4(bytebuff)
revpimodio2.netio.NetFH?1(address, check_replace_ios, timeout=500)
revpimodio2.netio.RevPiNetIO._create_myfh?5()
revpimodio2.netio.RevPiNetIO._get_cpreplaceio?5()
revpimodio2.netio.RevPiNetIO.config_changed?7
revpimodio2.netio.RevPiNetIO.disconnect?4()
revpimodio2.netio.RevPiNetIO.exit?4(full=True)
revpimodio2.netio.RevPiNetIO.get_config_changed?4()
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
revpimodio2.netio.RevPiNetIO.get_reconnecting?4()
revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None)

View File

@@ -289,7 +289,7 @@ class ProcimgWriter(Thread):
"""
__slots__ = "__dict_delay", "__eventth", "__eventqth", "__eventwork", \
__slots__ = "__dict_delay", "__eventth", "_eventqth", "__eventwork", \
"_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \
"_refresh", "_work", "daemon", "lck_refresh", "newdata"
@@ -299,7 +299,7 @@ class ProcimgWriter(Thread):
super().__init__()
self.__dict_delay = {}
self.__eventth = Thread(target=self.__exec_th)
self.__eventqth = queue.Queue()
self._eventqth = queue.Queue()
self.__eventwork = False
self._adjwait = 0
self._eventq = queue.Queue()
@@ -340,7 +340,7 @@ class ProcimgWriter(Thread):
or regfunc.edge == FALLING and not boolor:
if regfunc.delay == 0:
if regfunc.as_thread:
self.__eventqth.put(
self._eventqth.put(
(regfunc, io_event._name, io_event.value),
False
)
@@ -363,7 +363,7 @@ class ProcimgWriter(Thread):
for regfunc in dev._dict_events[io_event]:
if regfunc.delay == 0:
if regfunc.as_thread:
self.__eventqth.put(
self._eventqth.put(
(regfunc, io_event._name, io_event.value),
False
)
@@ -390,7 +390,7 @@ class ProcimgWriter(Thread):
"""Laeuft als Thread, der Events als Thread startet."""
while self.__eventwork:
try:
tup_fireth = self.__eventqth.get(timeout=1)
tup_fireth = self._eventqth.get(timeout=1)
th = EventCallback(
tup_fireth[0].func, tup_fireth[1], tup_fireth[2]
)
@@ -415,7 +415,7 @@ class ProcimgWriter(Thread):
self.__eventwork = value
if not value:
# Nur leeren beim deaktivieren
self.__eventqth = queue.Queue()
self._eventqth = queue.Queue()
self._eventq = queue.Queue()
self.__dict_delay = {}
@@ -533,7 +533,7 @@ class ProcimgWriter(Thread):
if self.__dict_delay[tup_fire] <= 0:
# Verzögertes Event übernehmen und löschen
if tup_fire[0].as_thread:
self.__eventqth.put(tup_fire, False)
self._eventqth.put(tup_fire, False)
else:
self._eventq.put(tup_fire, False)
del self.__dict_delay[tup_fire]

View File

@@ -850,7 +850,7 @@ class RevPiModIO(object):
or regfunc.edge == RISING and io.value \
or regfunc.edge == FALLING and not io.value:
if regfunc.as_thread:
self._imgwriter.__eventqth.put(
self._imgwriter._eventqth.put(
(regfunc, io._name, io.value), False
)
else:

View File

@@ -187,6 +187,9 @@ class NetFH(Thread):
"configuration on revolution pi was changed")
else:
self.__replace_ios_h = byte_buff[16:]
except ConfigChanged:
so.close()
raise
except Exception:
so.close()
else:
@@ -228,9 +231,7 @@ class NetFH(Thread):
"""Entfernt die konfigurierten Dirtybytes vom RevPi Slave.
@param position Startposition der Dirtybytes"""
if self.__config_changed:
raise ConfigChanged(
"configuration on revolution pi was changed"
)
raise ConfigChanged("configuration on revolution pi was changed")
if self.__sockend.is_set():
raise ValueError("I/O operation on closed file")
@@ -301,9 +302,7 @@ class NetFH(Thread):
def flush(self):
"""Schreibpuffer senden."""
if self.__config_changed:
raise ConfigChanged(
"configuration on revolution pi was changed"
)
raise ConfigChanged("configuration on revolution pi was changed")
if self.__sockend.is_set():
raise ValueError("flush of closed file")
@@ -337,6 +336,11 @@ class NetFH(Thread):
@return True, wenn Verbindung geschlossen ist"""
return self.__sockend.is_set()
def get_config_changed(self):
"""Pruefen ob RevPi Konfiguration geaendert wurde.
@return True, wenn RevPi Konfiguration geaendert ist"""
return self.__config_changed
def get_name(self):
"""Verbindugnsnamen zurueckgeben.
@return <class 'str'> IP:PORT"""
@@ -621,6 +625,7 @@ class NetFH(Thread):
return len(bytebuff)
closed = property(get_closed)
config_changed = property(get_config_changed)
name = property(get_name)
reconnecting = property(get_reconnecting)
timeout = property(get_timeout, set_timeout)
@@ -755,6 +760,15 @@ class RevPiNetIO(_RevPiModIO):
except ConfigChanged:
pass
def get_config_changed(self):
"""Pruefen ob RevPi Konfiguration geaendert wurde.
In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss
neu instanziert werden.
@return True, wenn RevPi Konfiguration geaendert ist"""
return self._myfh.config_changed
def get_jconfigrsc(self):
"""Laedt die piCotry Konfiguration und erstellt ein <class 'dict'>.
@return <class 'dict'> der piCtory Konfiguration"""
@@ -765,6 +779,10 @@ class RevPiNetIO(_RevPiModIO):
def get_reconnecting(self):
"""Interner reconnect aktiv wegen Netzwerkfehlern.
Das Modul versucht intern die Verbindung neu herzustellen. Es ist
kein weiteres Zutun noetig.
@return True, wenn reconnect aktiv"""
return self._myfh.reconnecting
@@ -835,6 +853,7 @@ class RevPiNetIO(_RevPiModIO):
dev._offset + dev._slc_out.start, dirtybytes
)
config_changed = property(get_config_changed)
reconnecting = property(get_reconnecting)