0

PySide UI を提供するプログラムを書いています。その中で、UI にプログレス バーが表示されている間、バックグラウンドで実行されるはずの一連の機能を設定するスレッドが開始されます。

concurrent.futuresマルチスレッド用に Python 2.7 用の Python 3 のバックポートを使用しています。

UI メソッドは次のようになります。

def doPostprocess(self):
    with ThreadPoolExecutor(max_workers=1) as executor:
        future = executor.submit(othermodule.func)
        while not future.done():
            QtGui.qApp.processEvents()
            self.progressbar.setValue(1)
            time.sleep(0.001)
    self.progressbar.hide()

これは私の最小限のothermodule.func外観です:

def func():
    logger.info("Some informational message")
    time.sleep(15)
    print "And we are done here"

「We are done here」は stdout に出力されることはありませんが、futureオブジェクトは への呼び出しの直後に完了したことを通知しlogger.infoます。

面白いことに、呼び出しを に変更するとlogger.debug、すべてが期待どおりに動作します。つまり、funcログが記録され、15 秒間スリープしてから stdout に出力され、その間ずっとメイン スレッドがプログレス バーを更新します。これは、アプリケーションに設定されているログレベルに関係なく発生します。

4

1 に答える 1