运行后台任务,然后运行 ​​GUI

Posted

技术标签:

【中文标题】运行后台任务,然后运行 ​​GUI【英文标题】:Running background tasks and then the GUI 【发布时间】:2013-10-01 08:21:59 【问题描述】:

好的,现在我的小项目几乎完成了,还剩下一些东西,它正在运行我的后台任务,然后显示我的 GUI。

class myGUIApp:
    def __init()__: 
        ....
    def createwidgets():
        ....

if __name__ == "__main__":
    import myBackgroundTasks
    x = myBackgroundTasks()
    x.startbackground1()  <----- this is background task that doesn't need user interaction
    x.startbackground2() <----- this is background task that doesn't need user interaction
    MainWindow = myGUIApp()
    MainWindow.show() <---- this is Pyside GUI

问题是这样的,直到我的 2 个后台任务完成后,GUI 才会“显示”,这可能需要相当长的时间,因为它们正在执行 I/O 作业和从互联网上抓取文件。我该怎么办?使用python的多线程(在后台任务中,我也在使用多线程)?线程?或多处理模块?还是其他人?谢谢你的回答。

【问题讨论】:

【参考方案1】:

您可以将其放在thread 上。由于 Qt gui 在其自己的线程中运行,因此使用起来很有效。使用queue 传回x 的结果。唯一的窍门是您何时何地需要x?如果你在你的 gui 中需要它,那么最好的办法是使用 gui 的 after 方法,如果它有一个,或者任何它的等价物。关键是您不会占用所有资源,不断检查输出队列。如果你在你的 gui 中放置一个 while 循环,它可能会导致 gui 冻结。

from threading import Thread
from Queue import Queue

class myGUIApp:
    def __init()__: 
        ....
    def createwidgets():
        ....

if __name__ == "__main__":
    import myBackgroundTasks
    QUEUE = Queue()
    def queue_fun(q):
        x = myBackgroundTasks()
        x.startbackground1()  <----- this is background task that doesn't need user interaction
        x.startbackground2() <----- this is background task that doesn't need user interaction
        q.put(x)
    THREAD = Thread(target=queue_fun, args=QUEUE)
    THREAD.start()
    MainWindow = myGUIApp()
    MainWindow.show() <---- this is Pyside GUI

    # if you can wait until after mainloop terminates to get x, put this here
    while THREAD.is_alive()
        try:
            x = QUEUE.get_nowait()
        except Queue.Empty:
            continue
    # if you need this inside Pyside, then you should put this inside Pyside,
    # but don't use while loop, use Qt after function and call self.wait

    def wait(self):
        try:
            x = QUEUE.get_nowait()
        except Queue.Empty:
            self.after(5, self.wait)

【讨论】:

感谢您的回答。不,我不需要“x”在 GUI 内。后台任务是诸如清理数据库之类的不需要用户交互的东西。用户需要的只是单击一些按钮从数据库中检索信息。就是这样。 线程对你有用吗?如果你不需要x,那么你就不需要队列,只需启动没有args的线程,并且没有队列,让它自己死。 嗨,我没试过。但我认为它会起作用,因为我还在后台任务代码中使用了线程。我想我知道从这里做什么。如果我遇到问题会发布。再次感谢。

以上是关于运行后台任务,然后运行 ​​GUI的主要内容,如果未能解决你的问题,请参考以下文章

怎么关闭WPS2019后台的自动运行,是关了后台又自动运行

如何把linux后台任务调到前台

Qt5中创建临时的后台线程。

如何在带有 Swing gui 的后台线程中使用 jdbc

php后台运行以及定时任务的4种实现原理以及代码

如何显示屏幕并运行一些“后台”任务(不使用线程)