トップページ > 記事閲覧
非同期読み込みの中止について
名前:たろう 日時: 2016/01/11 00:36

お忙しいところ恐れ入りますが、質問をお許しください。 動画を非同期読み込みで読み込んで、CheckHandleASyncLoadで読み込み終了を待っている際に 読み込みが完了せずにTRUEのまま一定時間を過ぎた時は中止するという形にしたいのですが 読み込みを中止するような関数は御座いますでしょうか? よろしくお願いいたします。
メンテ

Page: 1 |

Re: 非同期読み込みの中止について ( No.1 )
名前:管理人 日時:2016/01/17 15:53

ご返信が遅くなり申し訳ありません 動画の読み込みが長すぎて中止したいほどになることは正常に動作している限りは あまり無いことだと思うのですが、たろうさんが考えている『一定時間』とは どのくらいの時間( 何秒くらい )なのでしょうか?
メンテ
Re: 非同期読み込みの中止について ( No.2 )
名前:たろう 日時:2016/01/17 18:14

ご返信いただきありがとうございます 以前も動画読み込み関連で質問させていただき、結局別でインストールしていた メディアプレイヤーのせいだったことがあるので、DXライブラリとは関係無い可能性が大きいですが コーデックが入っていない動画を再生しようとした時に、エラーが帰ってくるまで数十秒かかる事があります。 ※ただし同条件でもすぐにエラーが帰ってくる事のほうが多いです。 例えば別ソフトの影響ではあっても、こういう謎のケースが起きた時に、 中止する手段は無いかと思いお聞きしました。 よろしくお願いいたします。
メンテ
Re: 非同期読み込みの中止について ( No.3 )
名前:管理人 日時:2016/01/17 19:26

なるほど… 恐らくエラーが返ってくる前に処理を中断することは仮にDXライブラリ内部の処理を 変更してもできないと思いますので(コーデックの中で不具合が発生しているので)、 『読み込み処理が終わったら自動的にハンドルを削除する』機能を追加してみました、 よろしければこちらのバージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // ハンドルの非同期読み込み処理が完了したらハンドルを削除するフラグを立てる int SetASyncLoadFinishDeleteFlag( int Handle ) ; 非同期読み込み途中のハンドルを引数に渡して呼ぶと、非同期読み込みの処理が終了したら 自動的にハンドルを削除してくれます なので、たろうさんのプログラムで「読み込み時間が長すぎるからエラーだ」と判断したタイミングで この関数を使用して削除の予約をして、次の処理に移ってしまう、ということができます ただ、コーデック内部で行われている「エラーが返ってこない状態」が中断されるわけではないので、 もしかすると「エラーが返ってこない状態」が内部で継続している状態で次のファイルの読み込みを 行おうとした場合「まだ行われている『エラーが返ってこない状態』が終わるまで、次のファイルの 読み込み処理も始まらない」かもしれません、仮にこうなってしまった場合、DXライブラリ側では どうすることもできませんので、申し訳ありませんが「エラーが返ってくるまでの数十秒」を待って いただくしかありません (- -;;
メンテ
Re: 非同期読み込みの中止について ( No.4 )
名前:たろう 日時:2016/01/17 21:21

新しい関数を追加していただきありがとうございます。 すみません追加で質問をお許し下さい。 @動画hdl = LoadGraph( パス1 ) ;としてその後SetASyncLoadFinishDeleteFlag( 動画hdl ) ; とすればエラーが無かった場合に後で自動的にDeleteGraph(動画hdl);と同じ処理が行われるという 認識でよろしいでしょうか? A管理人様の仰る通りやはりエラーが返ってこない状態では、次の読み込みも始まらないようでしたが、 先ほど数分待ってもエラーがずっと帰らないのでソフトを停止しようとするとソフトがフリーズして しまう事がわかりました。これはウィンドウズ側で終了を阻止していると考えたほうが良いでしょうか 特にAはDXライブラリの仕様と関係がある場合だけで結構です。 お手すきの時によろしければご返信下さい。よろしくお願いいたします。
メンテ
Re: 非同期読み込みの中止について ( No.5 )
名前:管理人 日時:2016/01/17 22:49

> @動画hdl = LoadGraph( パス1 ) ;としてその後SetASyncLoadFinishDeleteFlag( 動画hdl ) ; >  とすればエラーが無かった場合に後で自動的にDeleteGraph(動画hdl);と同じ処理が行われるという >  認識でよろしいでしょうか? いえ、SetASyncLoadFinishDeleteFlag( 動画hdl ) ; は 「読み込み時間が長すぎるから、もうエラー扱いにしよう」というタイミングで実行してください SetASyncLoadFinishDeleteFlag( 動画hdl ) ; を実行した場合は読み込みが成功しても失敗しても、 読み込み完了後に必ずハンドルが削除されてしまいますので > A管理人様の仰る通りやはりエラーが返ってこない状態では、次の読み込みも始まらないようでしたが、 >  先ほど数分待ってもエラーがずっと帰らないのでソフトを停止しようとするとソフトがフリーズして >  しまう事がわかりました。これはウィンドウズ側で終了を阻止していると考えたほうが良いでしょうか わかりません、推測ですが、ただでさえ『中々エラーが返ってこない』という異常事態が発生している中で、 更に次のファイルの読み込みを開始しようとしてコーデックのシステムが正常に動作しなくなって いるのかもしれません こちらは No.3 でお話した通りDXライブラリ内部ではなくDXライブラリが使用しているOSのAPIの 中で発生している現象なので、DXライブラリ側からはどうすることもできません…
メンテ
Re: 非同期読み込みの中止について ( No.6 )
名前:たろう(解決) 日時:2016/01/17 23:41

SetASyncLoadFinishDeleteFlagについて理解できました。ありがとうございます。 やはりコーデックの有無を確認せずに読み込もうとする所に問題がありますね^^; DXライブラリ外で起きている異常であるということで解決をつけさせていただきます。 ありがとうございました。
メンテ
Re: 非同期読み込みの中止について ( No.7 )
名前:たろう 日時:2016/01/18 00:38

すみません解決をつけておきながら度々失礼します。 今までVer 3.15cを使用していたのですが、このバージョンだとコーデックのない動画を読んだ時、 10%くらいの確率で数十秒の読み込み待ちが発生しますが、大抵は瞬時にエラーが帰って来ます。 念のためVer 3.16も試しましたがこちらも3.15cと同様たまに遅れても100%エラーが返ります。 ですが上でアップしていただいた最新のバージョンだと、90%くらいの確率で永遠にエラーが返ってこないようです。 両方のバージョンを切り替えて何度も確認しましたが。多分間違いないと思います。 ※SetASyncLoadFinishDeleteFlag() ;は使用していません 今後最新バージョンが使えなくなると困るので、よろしければご確認いただけますでしょうか? よろしくお願いいたします。
メンテ
Re: 非同期読み込みの中止について ( No.8 )
名前:管理人 日時:2016/01/18 00:43

分かりました すみません、ではたろうさんが試されたコーデックが無くエラーになってしまう動画の 形式を教えて頂けないでしょうか? 現在手元に『コーデックが無くエラーになってしまう動画』が無いもので… (_ _;
メンテ
Re: 非同期読み込みの中止について ( No.9 )
名前:たろう 日時:2016/01/18 01:19

たびたびすみません H.264の動画でためしました。 どうも起動してから、コーデックのない動画を一度目に読み込んだ時はエラーがすぐに返って 同じ動画か、もしくは同じ形式の動画を次に読み込むときにエラーが帰ってこないようです。 よろしくお願いいたします。
メンテ
Re: 非同期読み込みの中止について ( No.10 )
名前:管理人 日時:2016/01/18 02:42

ご返答ありがとうございます その後『コーデックが無くエラーになってしまう動画』を見つけることができ、 手元でも現象を再現できました CheckHandleASyncLoad の中で行うべき処理が一つ抜けており、それが原因で デッドロックが発生していたというものです たろうさんのNo.9での現象もこのバグが原因で発生しうるので、こちらの 修正バージョンで直せていると思います https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) お手数で申し訳ありませんが、よろしければお試しください m(_ _;m
メンテ
Re: 非同期読み込みの中止について ( No.11 )
名前:たろう(解決) 日時:2016/01/18 02:59

ありがとうございます。 以前のバージョンと同じ動作になることを確認しました。 また色々とお手数をおかけしてしまいました。 失礼致しますm(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存