したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

ソフトウェアに関する不具合、要望、感想

549tenteko:2020/03/20(金) 21:08:02 ID:4Hi1m3GA0
>これはメッセージを投げる前にファイルの解凍が終わっていることが原因のようです。

なるほど。
となると、多くの画像ファイルが入ったアーカイブ(LZMA2圧縮)を解凍したときに、
最後付近のファイルについてARCEXTRACT_BEGINが送出されていなかった現象が
時々発生していたのですが、これについても同じ原因と考えられそうです。


>ただ、解凍処理が終わっているのにメッセージを投げ続けるのはどうかなと思いますので、
>この修正については見送らせてください。

了解いたしました。
となりますと、これまでARCEXTRACT_BEGINに依存した処理をしていたのですが、改めることにしました。


これを受けまして、今現在、『どのファイルまで解凍したか』というのを判断するために、
次のような処理をしております。

==========

①SevenZipFindFirst及びSevenZipFindNextにより取得したファイル情報を順に配列に保存。
また、各ファイルがこの後確保するバッファのどの位置に解凍されるかも一緒に保存しておく。

②SevenZipGetArcOriginalSizeExによって解凍される全ファイルのサイズを取得し、
そのサイズでバッファを作成。

③バッファに対し、①のデータをもとに、各ファイルの先頭位置にダミーのデータ(1byte:値0x11)を
書き込んでおく。

④バッファに対し、別スレッドでSevenZipExtractMemExによる解凍開始。

⑤1/60秒毎に、③でデータを書き込んだ各位置を調査し、ダミーのデータと異なる値が書き込まれていれば、
直前のファイルの書き出しが完了したものとみなし、当該「直前のファイル」の書き出し完了のフラグを立てる。

⑥各ファイルの書き出し完了フラグを調査し、フラグが立っていれば(複数の別スレッドで)逐次
読み込みを開始する。

⑦また、任意のタイミングで解凍を中断(コールバック関数でreturn false)し、
SevenZipExtractMemExの終了を待って、別のアーカイブの解凍を開始する(①に戻る)こともできる。

==========

…以上の処理をしている中で、時々次のような現象が発生します。
沢山の画像ファイルが入ったアーカイブを解凍するという場合についてですが、


(1)コールバック関数で受信したメッセージから書き出したサイズが取得できますが、
これが最大値(全ファイルのサイズ)になっているにもかかわらず、

『全てのファイルについて書き出し完了のフラグが立たない(全く書き出されていない?)』

『最後の方で書き出される、連続する幾つかのファイルについて、書き出し完了のフラグが立たない、または
フラグが立っても正しいファイルとして読み込めない(ある地点から書き出しがストップしている?)』

という現象が時々発生します(同じアーカイブを読み込み直すと正常に解凍できたりします)。
7zipではなく、通常のzipの場合に発生しやすいような印象で、
特に⑦によって連続で解凍や中断を繰り返していると発生しやすい、
というのが体感的な印象でしょうか。

(2)書き出し完了のフラグが立っているファイルを読み込みに行っても、
壊れた画像ファイルとして表示されることがあります(書き出し途中のファイルを読み込んだ感じです)。
ただし、もう一度読み込み直すと正常に表示されます。
これも通常のzipの場合に発生しやすいような印象です。

(続く)


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板