1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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)
|