AniLaPaint ver 1.7.4 › フォーラム › バグ報告掲示板 › インポートできない › 返信先: インポートできない
つづき、
エラーに “WIC” の文字列が含まれていた場合(つまり、画像の読み込み時のエラーの場合)、同じスキャン画像に対して3回まで自動的にリトライします。同様に、 “BitmapDCisNull” または “DIBisNull” 文字列が含まれていた場合(つまり、メモリー不足の場合)、10 回まで自動的にリトライします。
リトライ開始までには、半秒ほど間を入れるようにしています。これによって、スレッド間でリソースの奪い合いが生じた場合でも、すぐにはあきらめないようになっています。
“BitmapDCisNull” “DIBisNull” の時、 10 回リトライしてダメだった場合、 “メモリが不足しています。” とエラーに表示して諦めます。
前投稿にある “FailedCreateBitmap” “DIBSectionIsNull” は作者がこのようなエラーが出ることを把握していなかったので、現在は1回もリトライせずに諦めています。次のバージョンではこの2つもリトライ対象にします。
実は、 Windows 10 の 32 bit 版の場合、メモリーが潤沢にあるにもかかわらずこれらのメッセージが出て処理を中断してしまうことが多々ありました。それは、 HD サイズの場合でも起こります。 32 bit OS の場合、いくら物理メモリーが 16 GB あっても、 OS 自体が 4 GB までしか認識しません。その 4GB から OS 自体が使った残りをアプリに回してきます。それなので、 OS が定期的に行っている何らかのバックグラウンド処理がたまたまインポート中に発生したりすると、メモリー不足になりインポートが飛び番になったりします。 Window 7 ではめったに起こらなかったのですが Windows 10 では頻発するようになりました。そのための対策が上記の自動リトライ機能なのです。
ただ、 32 bit OS での OS 内の処理によるメモリー不足の問題は一時的なもので、「半秒ほど間を入れ」るだけでメモリー不足が解消されている可能性がありますが、 64 bit OS の最大インポート処理に 3.6 GB まで使える環境での 8192 × 8192 pixel の画像のインポート時に起こる自動リトライの処理を開始するまでの時間が「半秒」と同じことは問題です。
なぜなら、 64 bit OS 上でメモリー不足が起こった場合、それは OS のバックグラウンド処理が原因ではなく、インポート処理内の別のスレッドがメモリーを使っている当事者であるという事に違いがあるからです。つまり、この場合は「半秒ほど間を入れ」たくらいでは、メモリー不足の状況は変わらないわけです。自動リトライが「半秒」× 10 =「合計5秒」くらいで高い確率でリトライを諦めてしまうことになるからです。
この場合、せめて「スレッドを一旦止めて、他のスレッドがすべて止まった状態になってからリトライする」くらいでないとメモリー不足は解消されません。
ただ当方の環境で何度試してみても、必ずエラーメッセージが表示され、インポート処理画面が突然クラッシュすることはありませんでした。
32 bit OS 上で例えば、メモリーが 2GB しかないのに、 2560 × 2560 pixel の画像を数スレッド使ってインポートしたりすると、極度のメモリー不足に陥って OS のもっと深い部分からの例外…つまり、構造化例外処理 (SEH) などが発生してしまっているのかもしれません。
SEH が発生したと仮定すると、インポート処理画面がエラーメッセージも何も表示せずに終了してしまったことの説明はつきます。
構造化例外処理 (SEH) が起こった場合は、普通はそのままクラッシュさせるのを OS 自体はお勧めしています。なぜなら、その復帰に失敗すると OS や他のアプリにもしわ寄せがいく可能性があるからです。
だからこれが発生するほどの究極のメモリー不足が起きた場合にインポート処理画面が何もエラーメッセージを表示せずにクラッシュしてしまう現象を今後も改善できません。そこには技術的限界があるからです。
でも、インポート処理画面が異常終了したのかどうかを、メインウィンドウ側のプロセスから調べることは可能なはずです。まだそれ用の API にたどり着いていないので修正には時間がかかりそうですが、いずれ適切なエラーメッセージを表示できるようにしたいと思います。
■ メモリーが少ない環境で、大きな画像をインポートする時の対策について
上記でも書きましたが、メモリー不足なのに複数のスレッドがメモリーを取り合ってさらに状況を悪化させるのが問題なので、最初から 1 スレッドのみをインポート処理に与えることでメモリー不足が改善できるかもしれません。
メインウィンドウの 「設定(N)」 メニューの 「環境設定(N)…」 を選択して表示されるダイアログで、
「一括処理」のタブをクリックすると、「● 一括処理の際のスレッド数」 というのがあります。
https://anilasoft.jp/help/anilapaint-1-5/property/thread/index.htm#thread_max
このスレッド数を 1 にすると、メモリーが少ない環境でも比較的大きな画像サイズの動画をインポートできる可能性があります。もっとも、元々1枚しかインポートしていないのにインポートできなかった場合には、これを 1 にしても何ら状況は変わりません。複数の画像をインポートしていて問題が発生した場合の対策としては有効です。
メモリーが少ない環境では、ビルド時にも同様の問題が起こります。
以上です