Что использовать для изменения переменной из недр потока?
Такая проблема: есть отдельный модуль. В нем класс, представляющий собой поток - threading.Thread. В нем переопределен метод run(). В нем выполняется некий код. Мне нужно, чтобы поток каким-то "чудом" либо возвращал полученное в run() значение, либо изменял переменную, которую ему передают. Использовать глобальную переменную не самый лучший выход - во-первых потому что глобальная, во-вторых потому что не красиво определять переменную модуля и ее уже использовать. И то лишь раз.
На данный момент я склоняюсь к варианту с использованием коллбеков - передать в класс функцию, которую он вызовет по окончанию run() и в нее передаст нужные данные. В теории способ рабочий, но может есть какой-то более "красивый" способ? А то я чую, что это будет говнокод (как и все мои работы, впрочем).
Язык: Python
Upd: Ах, да, забыл про пример) Код:
class Dscan_Recon(Thread):
def __init__(self):
super().__init__()
self.mx = 0
self.my = 0
def run(self):
for i in range(5, -1, -1):
print("[LOG] Задержка перед определением верхней-левой точки: "+str(i)+"s.")
time.sleep(1)
ovx1, ovy1 = wapi.GetCursorPos()
print("[LOG] Координаты верхней-левой точки: X: "+str(ovx1)+" Y: "+str(ovy1))
for i in range(5, -1, -1):
print("[LOG] Задержка перед определением верхней-левой точки: "+str(i)+"s.")
time.sleep(1)
ovx2, ovy2 = wapi.GetCursorPos()
print("[LOG] Координаты нижней-правой точки: X: "+str(ovx2)+" Y: "+str(ovy2))
x1, y1, _, _ = self.get_window_metrics(wHndl)
ovx1, ovy1, ovx2, ovy2 = ovx1-x1, ovy1-y1, ovx2-x1, ovy2-y1
Это класс с потоком. Мне нужно, чтобы он возвращал эти 4 значения в конце. Т.е. 2 точки на экране. Мне кажется, что коллбек здесь лучше всего подойдет. Но так ли это? Или может есть что-то более удобное?
Ответы (1 шт):
Ещё как вариант
class Dscan_Recon(Thread):
def __init__(self):
super().__init__()
...
self.result = None
def run(self):
...
self.result =...
t = Dscan_Recon()
t.start()
t.join()
r = t.result