午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

複数の画像ファイルを一度にトリミングして保存するアプリPixtrimをつくった20 メモリの開放と再描画

前回は1年前
 
 
大きな画像(1000x1000とか)を大量(数百枚以上)に保存実行するときの不具合を解消したつもり
保存実行時に10枚処理するごとにメモリの開放をするようにした
保存実行時に応答なしになっても描画更新して保存の実行状況がわかるようにした
 

f:id:gogowaten:20191023145748p:plain

大きな画像を大量に大きな切り取り範囲指定して保存実行すると
Pixtrimのメモリ使用量が1GBを超えていた
今までの実用では大きな切り取り範囲で処理することはなかったので気付かなかった
メモリの開放はVB.NETにお任せのDispose()は使っていたんだけど間に合わなかったみたいなので
System.GC.Collect()でメモリ解放を指示してから
System.GC.WaitForPendingFinalizers()でメモリ解放されるまで待機
っていう2行を追加した
とくにWaitForPendingFinalizers()、これを実行しないとメモリ解放しないで
次に処理に行ってしまってCollect()の意味が無い状態になっていた
どっちも便利なんだけどよくわからん
 

2015/09/02追記ここから
メモリ使用量減ってなかった…
テストの時は期待通りに動いていたんだけど、実際に使ってみたら違う動き
追記ここまで
 

 
参照したところ
Re[13]: 『「GC.Collect」メソッド』について
ここ見ると上の2行の後にもう一回System.GC.Collect()ってなっているけど
別に無くても動いているから書かなかった
 
 
 
処理中の再描画
これも大量の画像を処理するときに時間がかかって3秒位すると
アプリが応答なしの状態になって処理状況を表すプログレスバーも止まってしまう
これではプログレスバーの意味が無いってことで
 
参照したところ
全ては時の中に… : 【VB.NET】画面を再描画(更新)する
ここを見て
Me.Refresh()
自分自身(アプリ)を再描画する1行を追加した
これも10枚処理するごとに実行
 
 
ダウンロード
ファイル名
Pixtrim1.8.25.0.zip(32ビットWindows用)
Pixtrim1.8.25.0_x64.zip(64ビットWindows用)
 
ダウンロード先1
 
ダウンロード先2(ヤフーボックス)
 
Pixtrimは約1年ぶりの更新になった
 
 
 
次回は2日後