0

クラッターと悟りを検討してください。これらは両方ともアイドラーを提供し、イベントコールバックをイベントループに追加します。どちらもスレッドの使用を推奨しているようには見えませんが、代わりにイベント駆動型プログラミングを提案しています。

ただし、データプロデューサーが戻ってくる前に数秒の処理をかみ砕く場合はどうでしょうか。

確かに、この種の処理をアイドラーまたはイベントループに追加すると、UIの応答が停止しますか?

UIフレームワークでこのようなことをどのように行う必要がありますか?

参考までに-Pythonではこれら両方のフレームワークを使用しています。

ありがとう。

4

2 に答える 2

1

実際にはgobject.idle_add、ジェネレーター関数を使用して、スレッドなしでこれを実現するより良い方法があります。

def my_task(data):
    # ...some work...
    while heavy_work_needed:
        ...do heavy work here...
        progress_label.set_text(data) # here we update parts of UI
        # there's more work, return True
        yield True
    # no more work, return False
    yield False

def on_start_my_task_button_click(data):
    task = my_task(data)
    gobject.idle_add(task.next)

詳細については、このFAQ エントリを参照してください

于 2012-06-06T18:21:54.477 に答える
1

プロデューサー コードを小さなチャンクに分割できない場合は、間違いなくスレッドを使用する必要があります。クラッターは、GL のスレッド モデル (ステート マシンのコンテキストがスレッド ローカル ストレージに格納される) を考えると、GTK+ と同様、さらにそれ以上に、clutter_init() と clutter_main() を呼び出したスレッド以外の別のスレッドでは使用できません。一方、GMainLoop 機能を使用してスレッドからメイン ループへの UI 更新をスケジュールすることはまったく問題ありません。

Clutter には、Git リポジトリでこのパターンを実現する方法の例があります。

http://git.gnome.org/browse/clutter/tree/examples/threads.c

つまり、ブロック操作がスレッド内で実行されている場合は、gobject.idle_add() を使用して UI の更新をスケジュールする必要があります。

于 2012-06-06T12:54:34.327 に答える