Я пытаюсь написать уведомитель для форума.Я пытаюсь использовать QThread с QTimer для периодической проверки новых ответов.Но моя функция check () в моем потоке не работает в потоке, она блокирует графический интерфейс.Можете ли вы сказать, что с этим не так?
Я подозреваю сигналы, я использую сигнал времени ожидания QTimer для запуска метода check
, но создание и подключение сигнала времени ожидания для проверки функции находится за пределами run
метод.Но когда я перемещаю self.timer=QTimer(); timer.timeout.connect(self.check)
внутри run
метода, self.check
никогда не срабатывает.В любом случае, вы можете сказать мне, где я ошибаюсь?
class Worker(QtCore.QThread):
check_started = QtCore.pyqtSignal()
check_successful = QtCore.pyqtSignal()
check_failed = QtCore.pyqtSignal()
def __init__(self, user="", password="", check_frequency=5):
QtCore.QThread.__init__(self)
self.login_info = {"user": user, "password": password}
self.check_frequency = check_frequency
self.last_check_time = 0
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.check) #Would it run in thread or not?
self.unreads = {}
def run(self):
#When I do timer initialization here, it never triggers
self.check()
self.timer.start(self.check_frequency * 1000 * 60)
def check(self):
print "checking"
self.last_check_time = time.time()
self.check_started.emit()
check_result = self.check_for_unreads()
if check_result:
self.check_successful.emit()
else:
self.check_failed.emit()
def check_for_unreads(self):
frm = Forum(self.login_info["user"], self.login_info["password"])
#This class just uses Mechanize to fetch some pages;
#Not calculation or CPU-intensive actions.
if frm.login(): #returns true if successful login, else false
frm.get_unread_replies()
self.unreads=frm.unreads
return True
else:
return False
Извините за несколько вопросов.Я постараюсь объяснить больше, если что-то неясно.
Редактировать: Вот как я запускаю поток в моем коде GUI:
self.checker = Worker()
self.checker.login_info["user"] = self.settings["user"]
self.checker.login_info["password"] = self.settings["password"]
self.checker.check_frequency = self.settings["time"]
self.checker.check_started.connect(self.check_started)
self.checker.check_successful.connect(self.check_successful)
self.checker.check_failed.connect(self.check_failed)
self.checker.start()