diff options
Diffstat (limited to 'raveos-center/raveos_center/hatter.py')
| -rw-r--r-- | raveos-center/raveos_center/hatter.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/raveos-center/raveos_center/hatter.py b/raveos-center/raveos_center/hatter.py new file mode 100644 index 0000000..6c7349c --- /dev/null +++ b/raveos-center/raveos_center/hatter.py @@ -0,0 +1,101 @@ +import time + +from PyQt6.QtCore import QObject, QThreadPool, pyqtSignal + + +class _Jelzo(QObject): + kesz = pyqtSignal(object) + hiba = pyqtSignal(str) + + +_elo = set() + + +def hatterben(fuggveny, *args, kesz=None, hiba=None): + jelzo = _Jelzo() + _elo.add(jelzo) + + def vege(*_): + _elo.discard(jelzo) + + if kesz: + jelzo.kesz.connect(kesz) + if hiba: + jelzo.hiba.connect(hiba) + jelzo.kesz.connect(vege) + jelzo.hiba.connect(vege) + + def futas(): + try: + eredmeny = fuggveny(*args) + except BaseException as e: + jelzo.hiba.emit(str(e) or type(e).__name__) + else: + jelzo.kesz.emit(eredmeny) + + QThreadPool.globalInstance().start(futas) + + +_tar = {} +_futok = {} +_generacio = {} + + +def _indit(kulcs, fuggveny, args, varok): + generacio = _generacio.get(kulcs, 0) + _futok[kulcs] = {"fuggveny": fuggveny, "args": args, "varok": varok} + + def vege(ertek): + if _generacio.get(kulcs, 0) != generacio: + return + futo = _futok.pop(kulcs, None) + regi = _tar.get(kulcs) + _tar[kulcs] = (time.monotonic(), ertek) + for k, _, kiszolgalva in futo["varok"] if futo else []: + if k and (not kiszolgalva or regi is None or regi[1] != ertek): + k(ertek) + + def hibas(uzenet): + if _generacio.get(kulcs, 0) != generacio: + return + futo = _futok.pop(kulcs, None) + for _, h, _ in futo["varok"] if futo else []: + if h: + h(uzenet) + + hatterben(fuggveny, *args, kesz=vege, hiba=hibas) + + +def gyorsitott(kulcs, fuggveny, *args, kesz=None, hiba=None, kor=60): + meglevo = _tar.get(kulcs) + if meglevo and kesz: + kesz(meglevo[1]) + if meglevo and time.monotonic() - meglevo[0] < kor: + return + var = (kesz, hiba, meglevo is not None) + if kulcs in _futok: + _futok[kulcs]["varok"].append(var) + return + _indit(kulcs, fuggveny, args, [var]) + + +def tarolt(kulcs): + meglevo = _tar.get(kulcs) + return meglevo[1] if meglevo else None + + +def ervenytelenit(*kulcsok): + for kulcs in kulcsok or list(set(_tar) | set(_futok)): + _tar.pop(kulcs, None) + _generacio[kulcs] = _generacio.get(kulcs, 0) + 1 + futo = _futok.pop(kulcs, None) + if futo: + _indit(kulcs, futo["fuggveny"], futo["args"], [(k, h, False) for k, h, _ in futo["varok"]]) + + +def leallitas(ido_ms=3000): + _tar.clear() + _futok.clear() + pool = QThreadPool.globalInstance() + pool.clear() + pool.waitForDone(ido_ms) |