【问题标题】:Does a GUI-class argument violate thread-safety in tkinter?GUI 类参数是否违反了 tkinter 中的线程安全?
【发布时间】:2023-01-25 00:13:08
【问题描述】:

当从主 tkinter 线程启动具有 tkinter 功能的独立线程时,我了解到 tkinter 不是线程安全的艰难方法。我以(对我而言)不可重现的方式收到错误消息,主要是与内部连接有关的“主线程不在主循环中”德尔在我停止我的应用程序后打电话。有时内核在执行期间或之后崩溃,通常一切都运行顺利。

这些独立的线程应该在几台仪器上运行数据采集 (DAQ),根据仪器的类型使用不同的 GUI。线程化似乎是可行的,因为从一开始就不知道某个时间需要哪种仪器,如果仪器繁忙,DAQ 任务应该排队等。

所以,我现在的想法是在主线程没有任何 tkinter 功能的情况下启动 DAQ 线程。特定的 DAQ 线程知道要使用哪个特定的 GUI,并将这个特定的 GUI 类放入一个队列中,该队列在主 GUI/tkinter 线程中处理。然后将在 GUI/tkinter 线程中创建 GUI 类的实例。

只要在主 tkinter 线程中创建 GUI 实例,这种方法是否仍会违反线程安全或一切正常?

【问题讨论】:

  • 您当然可以在 tkinter 应用程序中使用线程(我已经做到了),但是您不能(或者更准确地说,不应该) 做的是从这些线程调用任何 tkinter 方法。这意味着您的 GUI 只需要存在于主线程中。您可以创建其他线程来处理其他作业(如 DAQ)并使用队列等从这些线程返回值。

标签: python multithreading class tkinter instance


【解决方案1】:

只要您只从单个线程访问 tkinter 小部件和函数,它就可以正常工作。据我所知,一个例外是从其他线程调用 event_genereate 方法是安全的。您可以将数据推送到队列上,然后生成一个事件,然后可以在主线程中处理该事件,然后可以从队列中拉出数据并进行处理。

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 2021-06-19
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多