队列中没有项目,但应该有python线程

时间:2019-02-12 03:00:21

标签: python multithreading tkinter queue

我正在开发一个带有独立线程的gui项目。当用户单击按钮时,将触发一个函数,该函数将数据发送到队列并启动另一个线程。然后,另一个线程从队列中获取数据并向其中添加新数据。 gui将在哪里获取该数据并执行某些操作。但这卡住了,说队列是空的?为什么会这样,我该如何解决?

def click():
            if self.uN.get() and self.pW.get():
                self.q.put("LOGIN")
                self.q.put(self.uN.get() + "," + self.pW.get())
            else:
                self.q.put("eFi")

            con = Connect(self.q)
            con.setDaemon(True)
            con.start()

            time.sleep(1)

            while True:
                root.update()
                try:
                    data = self.q.get(False)
                except queue.Empty:
                    pass
                else:
                    print(data + "+")
                    if data == "Fcon":
                        tkMessageBox.showerror("ERROR!", "Failed to connect to the server!")
                    elif data == "nCre":
                        tkMessageBox.showerror("ERROR!", "A text field is empty!")
                    elif data == "Gcon":
                        for item in root.winfo_children():
                            item.destroy()

                        self.mScreen()
                    else:
                        print("?")

                    print('!')
                    break

这是其他线程代码:

class Connect(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.s = socket.socket()
        self.q = q

    def run(self):
        while True:
            try:
                data = self.q.get()
            except Exception as e:
                pass
            else:
                if data == "LOGIN":
                    self.login()
                elif data == "eFi":
                    self.q.put("nCre")
                    print("??????")

    def login(self):
        info = self.q.get().split(",")

        self.q.put("Gcon")
        print("GOD")

1 个答案:

答案 0 :(得分:0)

该问题是由两个线程访问同一队列引起的,一个线程会在适当的线程能够访问该信息之前先获取信息。为了解决这个问题,我为每个线程设置了两个队列。