Fasie7 Version1.02リリース
ツイート1.シャットダウン時、終了処理がうまくいかない問題を修正 他
ファイル名:fse7102setup.exe (635121bytes)
右側のリンクからダウンロードしてください。
前バージョンを使っているとシャットダウン時、時々fasie764.exeが反応しないのでシャットダウンできないというWindows7のメッセージが見られ、何が原因なんだろうと考えていたのですが、マルチスレッドの終了処理において、スレッドが完全終了を検知するコードの所で止まっていたのが原因でした。つまりWaitFor..()のAPIで止まっていたと言うことです。
今回調査してわかったのですが、前バージョンはかなりの割合でシャットダウン時正常に終了されていないとわかりました。
スレッドが完全終了したことを検知しなくてはいけない理由は、デストラクタが有効に作用しなくて他のヒープメモリを解放し忘れる恐れがあるため設けたのですが、それが仇となっていました。
コードとしてはスレッドが完全終了したかどうかを完全に見なくなったため、メモリの解放忘れの潜在的なバグが発生したことになってしまいますが、それよりシャットダウン処理が滞ってしまう方が問題です。それに乱暴な話、メモリ解放はシャットダウン時Windowsが全部やってくれる(はず)なので、神経質になる必要もないでしょう。常駐ソフトなのでWindowsの始めから終わりまでずっとメモリ上に居座りますので。またWaitFor..()で止まっていると、お気に入りメニューの履歴情報がファイルに書き込まれず次回起動時に情報が更新されません。これも問題でした。タスクトレイから終了したときは前バージョンでも全く正常に動くのですから、Windowsの終了処理時のコードは難しいです。
一応Application Verifierでメモリリークしてないか診断しましたが、メモリリークはもちろんエラーはゼロでした。
それ以外の修正点としてはエクスプローラのフォルダ表示が滞っているとき、Fasie7の機能が無くなってしまうことがあるのを一応回避しました。具体的にはフォルダ表示ごとに発生するスレッドが完全終了する間は、次のフォルダ表示をしてもFasie7のフォルダの表示変更の機能をキャンセルしました。これは素早くフォルダ表示したときにも働きます。
しかし、正直言ってそれが有効に作用するのかわかりません。
すべてはUIAutomationのエラーの仕方が、後になってエラー報告するので問題を特定しにくいのが原因となっています。昔のWindowsならアプリケーションエラーが起こったら即座にアプリケーションは止まってしまい、原因の箇所の発見は比較的楽でした。
しかし、UIAutomationはエラーが起こってもある時間(数十秒から数分)までそのまま動いてしまうのでどこにエラーを起こしているか全く皆目見当が付かないのです。加えてエラー報告もせずに機能だけ無効になってしまうこともあります。実行ファイルがいつの間にか終了しているときもあります。この地味に止まってしまう挙動は本当に泣かされます。女性的なんですよ、挙動が。昔は男性的だった。
それに加えて、複雑なマルチスレッドの挙動と相まって、Fasie7はバグを取るのが非常に難しいソフトになってしまいました。もうそろそろデバッグからは解放されたいのですが。
Posted: 2012 年 2月 26 日, カテゴリー Fasie7.