dorothy
dorothy

Reputation: 1243

Running background tasks and then the GUI

okay so now i am almost finished with my little project with some bits left, that's running my background task and then showing my 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

The issue is this, the GUI doesn't "show" until my 2 background tasks are finished, which can take quite some time as they are doing I/O jobs and grabber files from the internet. How should i go about this? Using python's multithread (inside the background task, i am also using multithreading)? Qthread? or multiprocessing module? or others? thanks for answering.

Upvotes: 0

Views: 1246

Answers (1)

Mark Mikofski
Mark Mikofski

Reputation: 20178

You could put it on a thread. Since the Qt gui runs in its own thread this is efficient use. Use a queue to pass back the results of x. The only trick is where and when do you need x? If you need it inside your gui then the best thing to do is use the gui's after method, if it has one, or whatever it's equivalent is. The point is you don't hog up all the resources continuously checking the queue for the output. If you put a while loop inside your gui, it will probably cause the gui to freeze.

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)

Upvotes: 1

Related Questions