0

これで、バックグラウンド タスクを実行し、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 のマルチスレッドを使用していますか (バックグラウンド タスク内で、マルチスレッドも使用しています)? Qスレッド?またはマルチプロセッシングモジュール?または他の人?回答ありがとうございます。

4

1 に答える 1

1

あなたはそれを置くことができますthread。Qt GUI は独自のスレッドで実行されるため、これは効率的に使用できます。queueの結果を返すには、a を使用し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)
于 2013-09-25T16:38:38.990 に答える