2019年2月26日火曜日

Python、マルチスレッド


コンソールアプリを実行して標準出力を取得するGUIベースの汎用アプリを作った(前の記事の画像に写ってるやつね)
昔Cで作ったんだけど勉強含めてpythonへの移植的に
コマンドの与え方など、使いづらかったので当然手直しして
で、出来たんだけど、子プロセスからの出力に時間がかかる場合はメインダイアログが固まる
ffmpegでごちゃごちゃやってるときなど、全て終わってから一気に表示される
まあ良いんだけどやっぱ固まってると不安ですよね
これを解決するのは多分マルチスレッドだと思い調べてみたら簡単そうだった

問題はスレッドを作るにしても今の開発環境は基本的にdesignerで作ったダイアログクラスがメインになっていて、どこでどうスレッドを作れば良いのかってことです
現状は、サブプロセス実行は外で関数化して、メインクラスの中から呼んでいる
外の関数で標準出力を取得してyieldしてもらい、これをクラスの中でもらって出力ウインドウにセットしてる
クラスの中はyield待ちのループになってるんで、yieldが終わるまで固まってると思われる
で、こうしてみた

①def go:    #ここは変わらない、サブプロセス実行
  subprocess(ここで実行して標準出力取得して送る)
    pipe=stdout 
      yield pipe

②def test:  #ここから別スレッド
  (text_cmd からtext取得して実行する)
  for  *****  in( go()) :
    text_out.append
 
③class *** # メインダイアログのクラス
 def ***  # プロセス実行関数 ここでスレッドを作る
  thread_obj = threading.Thread(target=test, args...)
  thread_obj.start()

新しく作るのは②だけかな
①と②は一つにまとめても良いね
別関数にしてyield、ってのが良い感じだなって思うけど( ´∀`)

0 件のコメント:

コメントを投稿