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)