当前位置: 首页 > 面试题库 >

pygtk应用程序中的单独线程

於和志
2023-03-14
问题内容

我在处理pyGTK应用程序时遇到一些问题。我给线程一些时间来完成其任务,如果有问题,我还是继续继续,只是警告用户。但是,一旦我继续,该线程就会停止,直到调用gtk.main_quit为止。这让我感到困惑。

相关代码:

class MTP_Connection(threading.Thread):
    def __init__(self, HOME_DIR, username):
        self.filename = HOME_DIR + "mtp-dump_" + username
        threading.Thread.__init__(self)

    def run(self):
        #test run
        for i in range(1, 10):
            time.sleep(1)
            print i

....................................

start_time = time.time()
conn = MTP_Connection(self.HOME_DIR, self.username)
conn.start()
progress_bar = ProgressBar(self.tree.get_widget("progressbar"),
                           update_speed=100, pulse_mode=True)
while conn.isAlive():
    while gtk.events_pending():
        gtk.main_iteration()
    if time.time() - start_time > 5:
        self.write_info("problems closing connection.")
        break
#after this the program continues normally, but my conn thread stops

问题答案:

首先,不要继承threading.Thread,使用Thread(target=callable).start()

其次,很可能导致您明显的阻塞的原因是它gtk.main_iteration采用了一个block默认值为的参数True,因此gtk.main_iteration,在没有要迭代的事件时,对的调用实际上会阻塞。可以用以下方法解决:

gtk.main_iteration(block=False)

但是,没有真正的解释为什么您会使用此被黑客入侵的循环而不是实际的gtk主循环。如果您已经在主循环中运行此程序,那么我建议您做错了事。如果您给我们更多细节和/或完整示例,我可以扩展您的选择。

第三,也只有这一点上来后:永远永远 永远 永远 确保你已呼吁gtk.gdk.threads_init与任何线程应用PyGTK的。GTK
+在运行线程时具有不同的代码路径,因此需要知道如何使用它们。

我写了一篇关于pygtk和线程的小文章,为您提供了一个小的抽象,因此您不必担心这些事情。该帖子还包含进度条示例。



 类似资料:
  • 问题内容: 我目前正在开发一个Python应用程序,希望在该应用程序上查看实时统计信息。我想使用它以使其易于使用和理解。 问题是我的Flask服务器应该在我的Python应用程序的最开始处启动,而在最末尾停止。它看起来应该像这样: 因为我需要我的应用程序上下文(用于统计),所以不能使用multiprocessing.Process。然后,我尝试使用threading.Thread,但是Werkze

  • 问题内容: 有人可以给我一个以这​​种方式涉及线程的简单示例。 我的代码的问题是,当我单击按钮One时,GUI冻结直到完成。我希望在执行def时按钮保持响应。我该如何解决? 求您了,帮帮我。 问题答案: 使用gtk时,它将运行一个主循环,并将您想做的 所有事情 安排为gtk循环的事件。您不需要线程即可执行任何操作。 这是一个完整的,完整的,随时可以运行的示例,用于执行您想要的操作。 请注意,单击两

  • 问题内容: 是否可以以平台无关的方式使用Java应用程序的名称(而不是其位置)在单独的进程中加载​​Java应用程序? 我知道你可以通过…执行程序 …这种方法的主要问题是,此类调用是特定于平台的。 理想情况下,我会将方法包装成像…这样简单的东西。 …并以形式传入应用程序类的完全限定名称。 问题答案: 两个提示: 为你提供了Java可执行文件的路径。 帮助你重构当前应用程序的类路径。 然后你就是(伪

  • 现在假设我们想要使用 Spark API 写一个独立的应用程序。我们将通过使用 Scala(用 SBT),Java(用 Maven) 和 Python 写一个简单的应用程序来学习。 我们用 Scala 创建一个非常简单的 Spark 应用程序。如此简单,事实上它的名字叫 SimpleApp.scala: /* SimpleApp.scala */ import org.apache.spark.S

  • 问题内容: 我有一个多线程应用程序,在其中创建这样的线程: 现在在线程函数中, 我想 根据每个线程将&重定向到一个单独的文件中。类似于线程日志文件。 我该怎么办? 编辑: 如果可以在其他终端上显示特定于线程的打印。我的意思是,如果有2个线程,那么它将打开2个终端并在不同的终端上打印每个线程的数据。 问题答案: 如果您 真的 必须这样做… 首先,您需要创建2 s,一个用于,一个用于。这些可以使用创建

  • 我目前正在使用Android Room在Android上存储一些小数据。理论上,我使用allowMainThreadQueries()应该没有问题,因为我的所有数据都很小,但为了将来证明我的程序,我尝试将所有调用移动到一个单独的线程中。到目前为止,我在AppConfig中有一个静态处理程序,该类在应用程序初始启动时初始化,在应用程序范围内可见: DbHandler是一个扩展Handler的自定义类