#python #multithreading #pyqt
#python #многопоточность #pyqt
Вопрос:
Я создал серверное / клиентское приложение, и мне нужно добавить графический интерфейс на стороне сервера. До сих пор я тестировал и запускал его через окно cmd терминала. Однако, когда я пытаюсь реализовать графический интерфейс pyqt, окно графического интерфейса зависает, а затем выходит из строя.
Я подозреваю, что проблема заключается в серверной программе, которая создает два потока, где оба являются бесконечными циклами «while true», один ожидает ввода через окно cmd, а другой ожидает подключения (sock.accept()).
Я думал, что смогу решить эту проблему, создав в QApplication (gui) экземпляр серверной программы в виде QThread, но, похоже, это не работает.
Любые предложения о том, как это исправить? Я думал, что для программ будет довольно часто использовать бесконечные «циклы while» и графический интерфейс сверху?
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
self.show()
self.server = ServerThread()
self.pushButton.clicked.connect(self.server.main)
class ServerThread(QThread):
def __init__(self):
QThread.__init__(self)
self.server = None
def create_workers(self):
""" Create worker threads (will die when main exits) """
self.server = Server()
self.server.register_signal_handler()
for _ in range(NUMBER_OF_THREADS):
t = threading.Thread(target=self.work, args=(self.server,))
t.daemon = True
t.start()
return
def work(self, server):
""" Do the next job in the queue (thread for handling connections, another for sending commands)
:param server:
"""
while True:
x = queue.get()
if x == 1:
self.server.create_mcast_socket()
self.server.create_tcp_socket()
self.server.bind_tcp_socket()
self.server.accept_connections()
if x == 2:
self.server.start_turtle()
queue.task_done()
return
def create_jobs(self):
""" Each list item is a new job """
for x in JOB_NUMBER:
queue.put(x)
queue.join()
return
def main(self):
self.create_workers()
self.create_jobs()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
app.exec_()
Комментарии:
1. Вы запускали трассировку? Вы пробовали вести журнал?
2. где находится server.start() ? и основная функция должна быть переименована в run . Пока вы этого не сделаете, он не создаст отдельный поток.