QThread / Signal Logic - PullRequest
       5

QThread / Signal Logic

1 голос
/ 24 июня 2011

Я пытаюсь написать уведомитель для форума.Я пытаюсь использовать 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()

1 Ответ

0 голосов
/ 24 июня 2011

Похоже, основная проблема в том, что вы звоните time.sleep () . Я не вижу, где определено время, но если это обычный модуль времени для python, который заставит интерпретатор python приостановить работу, что, как я ожидаю, является причиной проблемы.

Поскольку вы не хотите смешивать потоки Python и потоки qt, я рекомендую использовать QThread.wait () . Это должно сделать все намного проще:

def run(self):
    while True:
        self.check()
        self.wait(self.check_frequency) # or do necessary unit conversion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...