試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKでのプログレスバーについて(ウィンドウが固まる件についてとその対処)

  1. 重い処理がメインループを邪魔してしまう
  2. 解決策の記述

重い処理がメインループを邪魔してしまう

重い処理を行っている最中に、set_fraction()などを呼んでプログレスバーに対して状況の更新をしようとしても、ウィンドウが固まってしまってうまく動作しない。
こうなってしまう理由は、GTK+アプリケーションがイベント駆動型のプログラムであること。重い処理のせいでメインループが正常に回らず、描画も意図した通りに行われない。
残念ながら、チュートリアルは、この問題の解決には役に立たなかった。
そこでFAQを探したところ、この件についての分析と解決策が載っていた。

解決策の記述

  • 重い処理はPythonのジェネレータとして書き、処理を行うループ内の最後に「yield True」を、ループの後、処理が全て終わるところで「yield False」を書く
  • 処理を開始する部分では、ジェネレータオブジェクトのメンバ関数next()gobject.idle_add()(リファレンス)に指定

これにより、メインループよりも低い優先度で(処理が終了するまで)繰り返しnext()が呼ばれる。また、この書き方だと、真偽値の変数を用意して、ループ内でその判定を行うようにすることで、途中で処理を停止するようなことも楽に行える。
実際のコード例は別記事で扱う。