2025年9月17日水曜日

複数ファイルの移動ツール自作 Qtのスレッド


最近はあまりプログラミングをしてなかったけどどうしても欲しくなって自作した。pyqtです。1G程度の大きなファイルをバッファを使ってコピーしてCRCチェックしてから元ファイルを削除することを繰り返すツール。

ウィンドウズだと結構良いコピー・移動ツールがあるんだけど、linuxだと探してもなかった。同期ツールはあるんだけど、そこまでは必要じゃない。単一ファイルの移動ツールは自作してあったんだが、複数ファイルを自動で次々と移動するツールはどうやったら良いのか仕組みが思いつかず作れないでいた。単一ファイルでもコピーは時間がかかるのでGUIの反応を止めないためにはスレッドが必要でちょっと面倒だった。複数になると更に複雑になりそうで作れないでいた。

いいアイデアがあったわけでもないのだが今回は必要に迫られてまずはフォーム作りから初めて少しづつ書いていって、やはり単一ファイルの移動後に次のファイルに行くところで躓いた。ループで回すとコピー自体を別のスレッドに投げてる関係でうまく行かない。なんとか工夫してうまく回るようにはしたけどなんとなく落ち着きが悪い感じ。まあ想定通り動いてくれてるので良しとしても良いんだけどもう少し考えるか。
プログラミングはやっぱり面白いなあ〜(・∀・)

----2025/09/19------------------
実際に使ったらクラッシュした。しかし再現性高くなくこういうのはcではよくあるけどpythonでは初めて。コプリに聞いたりして色々考えてスレッド周りに狙いをつけて書き直してとりあえずはクラッシュしなくなった。
スレッドはクラス化して移動ファイルの数だけ呼んでるが別インスタンスになるはずだから干渉しあわないのが理屈だがQtの世界では必ずしもそうではないらしくスレッドを完全にクリアする前にまた呼び出したらクラッシュする場合があるらしい。よくわからないけどそうならないように書き換えたらとりあえずはうまくいった。
プログラミングはやっぱり面白いわ (・∀・)

----2025/09/20 Qtのスレッドについて------------------
クラッシュ対応としてのスレッドコーディングだけど、コピールーチンをクラス化して別スレッドで呼んでいたが、スレッドでは処理の最後にメインへ文字列をemitする仕様にしていた。スレッドは処理が終われば自動的に終了破棄されるので終了処理は明示的には何もしていなかった。これがだめだったらしい。emitされたsignalはキューに積まれるだけですぐ処理されるとは限らない。処理が回ってきたときQtはemit元のチェックもするらしく、文字列は受け取れてもemit元が破棄されていたらクラッシュにつながる可能性があるらしい。スレッドが生きていたら問題ないからタイミングの問題となり常にクラッシュするわけではなくなる。この対策としてはスレッドを deleteLater することが推奨されていて、これはスレッド破棄のタイミングを調整してクラッシュしないようにする仕組みらしい。結局このdeleteLater をメインに組み込むことでクラッシュを回避できるようになった。昨日書いたスレッドを重複して呼び出したらクラッシュするというのは違う。破棄のタイミングが早すぎたらクラッシュするということだ。でもスレッドの二重起動も問題はあるらしくどうなんだろう、やはりスレッドは難しいな。QTのスレッドを使ってたけどpythonのスレッドだったら良かったのかな?まだまだ理解が足りないかな??

----2025/09/23 ------------------
結構毎日使うのでいろいろ更新。ファイラから直接移動ファイルを渡して起動、全体進捗のプログレスバー実装、経過時間と予想処理時間の表示など。いい感じになってきた。
AIがほんとに良い働きをしてくれる。最近はMSのコパイロットを愛用してるが、よくわからなくてネットでいろいろ検索する時代は終わったのかもしれない。Googleって広告収入頼りだよなあ、検索が減りだすとGoogle自体も変わっていくのかな。

0 件のコメント:

コメントを投稿