powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Один поток останавливает работу другого потока pyqt5
2 сообщений из 2, страница 1 из 1
Один поток останавливает работу другого потока pyqt5
    #40116232
georgy_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста, я новичок в pyqt и понятия не имею в чем дело. Перечитал массу литературы и все равно не понимаю.

Пишу небольшую програмку для собственных нужд. Суть в том, что она тянет данные из MS SQL SERVER и возвращает результат. В ней есть один очень долгоиграющий запрос, который я хочу поместить в отдельный поток, что бы он не блокировал работу всего приложения.



Выглядит это примерно вот так. class MyThread - выполняет две функции из основного класса class MyThread4 - как раз в нем и находится самый длинный запрос, который и должен быть в отдельном потоке, что бы не блокировать работу. Проблема в том, что при запуске длинного потока MyThread4, он блокирует первый поток MyThread (приложение не зависает и продолжает работать). Приложение не виснет, но MyThread не может продолжить работу, пока не завершится работа MyThread4.

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
import sys
    from PyQt5.QtGui import QIcon
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtCore import QSize, Qt, QThread
    from PyQt5.uic import loadUi
    from PyQt5.QtWidgets import QDialog, QApplication
    import pyodbc
    from redminelib import Redmine
    from dateutil.relativedelta import relativedelta
    from io import BytesIO
    from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
                                 QDialogButtonBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout,
                                 QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QSpinBox, QTextEdit,
                                 QVBoxLayout)
    
 class MyThread(QtCore.QObject):
    
        mysignal1 = QtCore.pyqtSignal()
    
        def __init__(self, parent=None):
            QtCore.QObject.__init__(self, parent)
    
        def run(self):
            self.change_x()
    
        def change_x(self):
            while True:
                print('start')
                application.heavy_job()
                time.sleep(6)
                application.cpu_sql()
      
                self.mysignal1.emit()
    
    
    class MyThread4(QtCore.QObject):
        mysignal = QtCore.pyqtSignal()
    
        def __init__(self, parent=None):
            QtCore.QObject.__init__(self, parent)
    
        def second_work(self):
                print('start signlal')
                # Передача данных из потока через сигнал
                application.index_frag_inf()
    
    
    
    class mywindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(mywindow, self).__init__()
            self.ui = Ui_MainWindow()
            self.server = None
            self.password = None
            self.username = None
            self.database= None
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
        try:
            """Создается подключение к серверу"""
            self.conn = conn = pyodbc.connect(
                'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + self.server + ';DATABASE=' + self.database + ';UID='
                + self.username + ';PWD=' + self.password, autocommit=True)  # запускает соединение с SQL-сервером
            self.cursor = cursor = conn.cursor()  # создается cursor для соединения
            print('connect succcesfull')
        except Exception:
            return
    
            self.worker1 = MyThread()
            self.worker1.moveToThread(self.thread1)
            self.ui.butt_conn.clicked.connect(self.worker1.change_x)
            self.thread1.start()
    
    
    
            self.worker = MyThread4()
            self.worker.moveToThread(self.thread)
            self.ui.startcheckindex.clicked.connect(self.worker.second_work)
            self.thread.start()
    
     self.ui.tableWidget.setColumnCount(6)
            self.ui.tableWidget.setHorizontalHeaderLabels(('сюда передаются столбцы'))
            self.ui.tableWidget.setColumnWidth(0, 100)
            self.ui.tableWidget.setColumnWidth(1, 100)
            self.ui.tableWidget.setColumnWidth(2, 200)
            self.ui.tableWidget.setColumnWidth(3, 400)
            self.ui.tableWidget.setColumnWidth(4, 80)
            self.ui.tableWidget.setColumnWidth(5, 500)
    
    
    
        def index_frag_inf(self):
            self.ui.tableWidget.clearContents()
            self.cursor.execute(""" 
            Здесь длинный запрос с очень долгим выполнением """)
            self.ui.tableWidget.setRowCount(100)
            tablerow = 0
            for index in self.cursor.fetchall():
                self.ui.tableWidget.setItem(tablerow, 0, QtWidgets.QTableWidgetItem(index[0]))
                self.ui.tableWidget.setItem(tablerow, 1, QtWidgets.QTableWidgetItem(index[1]))
                self.ui.tableWidget.setItem(tablerow, 2, QtWidgets.QTableWidgetItem(index[2]))
                self.ui.tableWidget.setItem(tablerow, 3, QtWidgets.QTableWidgetItem(index[3]))
                self.ui.tableWidget.setItem(tablerow, 4, QtWidgets.QTableWidgetItem(index[4]))
                self.ui.tableWidget.setItem(tablerow, 5, QtWidgets.QTableWidgetItem(index[5]))
                tablerow += 1



    def cpu_sql(self):
        self.cursor.execute(""" Запрос из MS SQL""")
        for cpusql in self.cursor.fetchall():
            self.ui.cpupercent.setText(str(cpusql.cpu_sql))


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = mywindow()
    application.show()
    sys.exit(app.exec())




Помогите пожалуйста! Не могу понять где и в чем именно проблема. Заранее благодарю и хорошего дня!
...
Рейтинг: 0 / 0
Один поток останавливает работу другого потока pyqt5
    #40116385
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
georgy_2012,

Добрый день,

вы импортировали
Код: python
1.
from PyQt5.QtCore import QSize, Qt, QThread

, но не используете QThread - это на первый взгляд
и ещё выглядит нелогичным
Код: python
1.
class MyThread(QtCore.QObject):

- если вы хотите использовать кутэшные потоки, а не родные питоновские, то наверное и наследовать стоит от QThread - это было бы логичнее
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Один поток останавливает работу другого потока pyqt5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]