mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
_dict_events ist nun Threadsicher
Bei Fehler in ProcimgWriter System sauber verlassen
This commit is contained in:
@@ -513,6 +513,11 @@ Aktiviert oder Deaktiviert die Eventueberwachung.
|
||||
<dd>
|
||||
True aktiviert / False deaktiviert
|
||||
</dd>
|
||||
</dl><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn Anforderung erfolgreich war
|
||||
</dd>
|
||||
</dl><a NAME="ProcimgWriter._get_ioerrors" ID="ProcimgWriter._get_ioerrors"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
ProcimgWriter._get_ioerrors</h3>
|
||||
|
||||
@@ -284,9 +284,8 @@ class Device(object):
|
||||
self._modio.readprocimg(self)
|
||||
|
||||
# Datenkopie anlegen
|
||||
self._filelock.acquire()
|
||||
with self._filelock:
|
||||
self._ba_datacp = self._ba_devdata[:]
|
||||
self._filelock.release()
|
||||
|
||||
self._selfupdate = True
|
||||
|
||||
|
||||
@@ -384,10 +384,16 @@ class ProcimgWriter(Thread):
|
||||
|
||||
def _collect_events(self, value):
|
||||
"""Aktiviert oder Deaktiviert die Eventueberwachung.
|
||||
@param value True aktiviert / False deaktiviert"""
|
||||
@param value True aktiviert / False deaktiviert
|
||||
@return True, wenn Anforderung erfolgreich war"""
|
||||
if type(value) != bool:
|
||||
raise ValueError("value must be <class 'bool'>")
|
||||
|
||||
# Nur starten, wenn System läuft
|
||||
if not self.is_alive():
|
||||
self.__eventwork = False
|
||||
return False
|
||||
|
||||
if self.__eventwork != value:
|
||||
with self.lck_refresh:
|
||||
self.__eventwork = value
|
||||
@@ -401,6 +407,8 @@ class ProcimgWriter(Thread):
|
||||
self.__eventth.daemon = True
|
||||
self.__eventth.start()
|
||||
|
||||
return True
|
||||
|
||||
def _get_ioerrors(self):
|
||||
"""Ruft aktuelle Anzahl der Fehler ab.
|
||||
@return Aktuelle Fehleranzahl"""
|
||||
@@ -456,13 +464,13 @@ class ProcimgWriter(Thread):
|
||||
if self._modio._monitoring:
|
||||
# Inputs und Outputs in Puffer
|
||||
for dev in self._modio._lst_refresh:
|
||||
dev._filelock.acquire()
|
||||
with dev._filelock:
|
||||
dev._ba_devdata[:] = bytesbuff[dev._slc_devoff]
|
||||
if self.__eventwork \
|
||||
and len(dev._dict_events) > 0 \
|
||||
and dev._ba_datacp != dev._ba_devdata:
|
||||
self.__check_change(dev)
|
||||
dev._filelock.release()
|
||||
|
||||
else:
|
||||
# Inputs in Puffer, Outputs in Prozessabbild
|
||||
for dev in self._modio._lst_refresh:
|
||||
@@ -493,7 +501,7 @@ class ProcimgWriter(Thread):
|
||||
finally:
|
||||
# Verzögerte Events prüfen
|
||||
if self.__eventwork:
|
||||
for tup_fire in list(self.__dict_delay.keys()):
|
||||
for tup_fire in tuple(self.__dict_delay.keys()):
|
||||
if tup_fire[0].overwrite and \
|
||||
getattr(self._modio.io, tup_fire[1]).value != \
|
||||
tup_fire[2]:
|
||||
|
||||
@@ -377,6 +377,7 @@ class IOBase(object):
|
||||
)
|
||||
|
||||
if self not in self._parentdevice._dict_events:
|
||||
with self._parentdevice._filelock:
|
||||
self._parentdevice._dict_events[self] = \
|
||||
[IOEvent(func, edge, as_thread, delay, overwrite)]
|
||||
else:
|
||||
@@ -410,6 +411,7 @@ class IOBase(object):
|
||||
)
|
||||
|
||||
# Eventfunktion einfügen
|
||||
with self._parentdevice._filelock:
|
||||
self._parentdevice._dict_events[self].append(
|
||||
IOEvent(func, edge, as_thread, delay, overwrite)
|
||||
)
|
||||
@@ -619,6 +621,7 @@ class IOBase(object):
|
||||
"""
|
||||
if self in self._parentdevice._dict_events:
|
||||
if func is None:
|
||||
with self._parentdevice._filelock:
|
||||
del self._parentdevice._dict_events[self]
|
||||
else:
|
||||
newlist = []
|
||||
@@ -629,6 +632,7 @@ class IOBase(object):
|
||||
newlist.append(regfunc)
|
||||
|
||||
# Wenn Funktionen übrig bleiben, diese übernehmen
|
||||
with self._parentdevice._filelock:
|
||||
if len(newlist) > 0:
|
||||
self._parentdevice._dict_events[self] = newlist
|
||||
else:
|
||||
|
||||
@@ -312,7 +312,7 @@ class RevPiModIO(object):
|
||||
@param milliseconds <class 'int'> in Millisekunden"""
|
||||
if self._looprunning:
|
||||
raise RuntimeError(
|
||||
"can not change cycletime when cycleloop or mainloop are "
|
||||
"can not change cycletime when cycleloop or mainloop is "
|
||||
"running"
|
||||
)
|
||||
else:
|
||||
@@ -580,9 +580,8 @@ class RevPiModIO(object):
|
||||
|
||||
# Beim Eintritt in mainloop Bytecopy erstellen
|
||||
for dev in self._lst_refresh:
|
||||
dev._filelock.acquire()
|
||||
with dev._filelock:
|
||||
dev._ba_datacp = dev._ba_devdata[:]
|
||||
dev._filelock.release()
|
||||
|
||||
# ImgWriter mit Eventüberwachung aktivieren
|
||||
self._imgwriter._collect_events(True)
|
||||
|
||||
Reference in New Issue
Block a user