@pypyshka

Как правильно остановить поток QThread?

Добрый день.

Имеется программка, написана на Python 3.4.4 с использованием PyQt 4.11.4, которая парсит сайт каждые 10 минут. При запуске программы проверяется подключение к сайту check_connect(): если доступ есть, то status_connect = 1 и запускается поток. Каждые 10 минут также происходит проверка подключения к сайту. Проблема в том, что, если сайт через некоторое время станет недоступным и сработает функция get_docs(sc), то программа просто вылетит. Я так понял это происходит по той причине, что поток продолжает работать и нужно его остановить или завершить. Я пробовал в исключения TimeoutError и ConnectionError добавлять check_docs.exit(). Может быть причина совсем не в потоке. Посоветуйте, пожалуйста, что можно сделать в таком случае?

def check_connect():
    global status_connect
    try:
        UTM_connect = HTTPConnection("test.ru")
        UTM_connect.request("GET", "/")
        UTM_connect.close()
    except TimeoutError:
        status_connect = 0
    except ConnectionError:
        status_connect = 0       
    else:
        status_connect = 1

def get_docs(sc):
    check_connect()
    if status_connect == 1:
        '''
        парсинг сайта

        '''
       s.enter(600, 1, get_docs, (sc,))

class check_docs_cl(QtCore.QThread):
    def __init__(self, parent = None):
        QtCore.QThread.__init__(self, parent)
    
    def run(self):
        global s       
        s = sched.scheduler(time.time, time.sleep)
        s.enter(10, 1, get_docs, (s,))
        s.run()

class main_cl(QtGui.QMainWindow):
    def __init__(self):
        super().__init__()         
            uic.loadUi("main.ui", self)       

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    main_window = main_cl()
    check_docs =  check_docs_cl()
    check_connect()
    if status_connect == 1:
        check_docs.start()
    sys.exit(app.exec_())
  • Вопрос задан
  • 833 просмотра
Решения вопроса 1
@Sergey6661313
*учительским тоном:
Ежели check_docs выполняется один раз, и функции в нём работают исключительно с глобальными переменными, и содержит он всего лишь одну функцию, и вы запускаете в нём другой поток (sched.scheduler) нафига вам тогда вообще QThread??? да и вообще зачем в нутри get_docs пытаться перезапустить таймер который его вызвал? ведь ваш get_docs так и останется в стеке памяти а через ебалион циклов он просто выведет ошибка рекурсии, потому что будет бесконечно ожидать когда же комманды в цикле комманд (s.enter -> s.enter -> s.enter -> s.enter и т.д.) вдруг закончатся... И почему бы вам не написать нам вывод вашей ошибки в консоль?

*обычным голосом:
ладно теперь серьёзно - раз уж используете pyqt то используйте на всю катушку!:
class МойПервыйТаймерНаQt(QtCore.QObject):
    def __init__(self):
        super().__init__()
        self.basictimer = QtCore.QBasicTimer()
        self.basictimer.start(2000, self) # задержка в миллисекундах. 2000 для примера потому что 10 сек мне долго.

    def timerEvent(self, QTimerEvent):
        get_docs(self)  # вы конечно можете создать обьект sched.scheduler и передавать его, но зачем?


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    main_window = main_cl()
    мой_первый_таймер_на_Qt = МойПервыйТаймерНаQt()
    sys.exit(app.exec_())


и уберите строчку "s.enter(600, 1, get_docs, (sc,))" из get_docs
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы