为什么启动程序时pyqt GUI冻结?

时间:2019-04-08 06:32:00

标签: python multithreading pyqt

我已经制作了一个服务器/客户端应用程序,需要在服务器端添加一个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_()

0 个答案:

没有答案