Я создал приложение сервер / клиент и мне нужно добавить графический интерфейс на стороне сервера. До сих пор я тестировал и запускал его через окно терминала cmd. Однако когда я пытаюсь реализовать pyqt GUI, окно GUI зависает, а затем вылетает.
Я подозреваю, что проблема заключается в серверной программе, которая создает два потока, где оба являются бесконечными циклами "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_()