我已经制作了一个服务器/客户端应用程序,需要在服务器端添加一个GUI。到目前为止,我一直在通过终端cmd窗口进行测试和运行。但是,当我尝试实现pyqt GUI时,GUI窗口会冻结然后崩溃。
我怀疑问题出在服务器程序中,该程序创建两个线程,两个线程都是无限的“ while true”循环,一个线程等待通过cmd窗口输入,另一个线程等待连接(sock.accept())。
我认为我可以通过使QApplication(gui)将服务器程序实例化为QThread来解决此问题,但这似乎不起作用。
有关如何解决此问题的任何建议?我认为程序使用无限的“ while循环”和顶部的GUI是很普遍的吗?
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_()