@pypyshka

Как понять причину крэша программы во время работы потока?

Добрый день. Помогите, пожалуйста, найти причину вылетов программы. Я использую Python 3.4.4 и PyQt 4.11.4. Программа имеет интерфейс с QTableView, куда подгружаются данные из БД Sqlite и несколько чекбоксов, которые включают дополнительные колонки в таблице. Также по таймеру запускается поток, в котором выполняется парсинг сайта и сохранение информации в БД. Всё работает хорошо, если ничего не трогать. Если в момент запуска потока или когда во время потока парсится сайт быстро изменять размер главного окна (мышкой увеличивать и уменьшать размер), быстро скроллить таблицу (по вертикали или горизонтали), быстро включать/выключать чекбоксы, то программа просто крэшится. Если выполнять те же самые действия, только медленно, то все работает без проблем. Исключение - изменение размера окна: программа крэшэтся при любой скорости изменения размера, если в это время работает поток. Куда копать?

Код программы:
def check_connect():
    try:
        site_connect = HTTPConnection("test.ru")
        site_connect.request("GET", "/")
        site_connect.close()
    except ConnectionRefusedError:
        return False
    except TimeoutError:
        return False
    except ConnectionError:
        return False     
    else:
        return True
		
def checkBox_db():
    stateCB = main_window.checkBox_1.isChecked()
    stateCB_2 = main_window.checkBox_2.isChecked()
    stateCB_3 = main_window.checkBox_3.isChecked()
    if stateCB is True and stateCB_2 is True and stateCB_3 is True:
        DB_connect = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        DB_connect.setDatabaseName("database.db")
        DB_connect.open()
        cb_model = QtSql.QSqlQueryModel(parent=None)
        cb_model.setQuery("SELECT * FROM table")
		main_window.tableView.setModel(cb_model)
		DB_connect.close()
		...
	
class check_docs_cl(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
		
    def run(self):
        check_connect()
        if check_connect():
            '''парсинг сайта'''

class docsTimer(QtCore.QObject):
    def __init__(self):
        QtCore.QObject.__init__(self)
        self.basictimer = QtCore.QBasicTimer()
        self.basictimer.start(600000, self)        

    def timerEvent(self, QTimerEvent):
        check_docs.start()

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()
    main_window.checkBox_1.stateChanged.connect(checkBox_db)
    main_window.checkBox_2.stateChanged.connect(checkBox_db)
    main_window.checkBox_3.stateChanged.connect(checkBox_db)
    check_connect()
    if check_connect():
        docs_timer = docsTimer()
    sys.exit(app.exec_())
  • Вопрос задан
  • 362 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы