Re: 初回例外について ( No.1 ) |
- 名前:管理人 日時:2016/10/12 00:52
手元の環境でサンプルプログラムを動かし、DxLib_Init の後に画面表示ウインドウを非アクティブに
してみましたが、例外は発生しませんでした
> もちろん例外設定を外せば通常通りデバッグできるのですが、
> 何か問題がないかをお聞きしたいです。
普通は発生しないはずなので、問題はあると思います
> また、こちらが本題ですが、現在マルチスレッドでロード画面を作成しております。
> その際、デバッグするとたまに下記エラーが発生します。
複数のスレッドからDXライブラリの関数を呼んでいる、ということは無いでしょうか?
DXライブラリはマルチスレッドに対応していませんので、DxLib_Init を呼んだスレッド以外から
DXライブラリの関数を呼んだ場合の動作の保証はできません m(_ _;m
|
Re: 初回例外について ( No.2 ) |
- 名前:SHIN 日時:2016/10/12 13:04
素早いご返信ありがとうございます。
最初の例について少し、語弊がありましたので付け加えさせていただきます。
初回の例外を確認するため、下記コードに書き換えた状態でデバッグを実行し、DXライブラリの画面以外をクリックして非アクティブ化すると発生するのですが、
この状態では発生しませんでしょうか?
また、この例外はLog.txtには反映されずVisual Studioの出力画面にしか出ていません。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
// 確認のためウインドウモードに変更しています。
ChangeWindowMode(true);
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// BMP画像の表示
LoadGraphScreen(0, 0, "test1.bmp", TRUE);
WaitKey() ; // キーの入力待ち((7-3)『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
本題のマルチスレッドの方ですが、
知識不足で大変申し訳ないのですが、確認させてください。
現在、プログラムの構成として、ロード画面に入る前にメインスレッドでDX_Init()を実行し、
サブスレッドでDXライブラリのロード関数を使用して(MV1LoadModelFromMem等)ロードしつつ、
メインスレッドでロード画面をDXライブラリの関数を使用して描画するという構成になっております。
複数のスレッドでDXライブラリの関数を使用した場合、動作の保証ができないということでしたが、
つまり、マルチスレッドでロード画面を作成する場合、メインスレッドでDX_Init()とロードを実行し、
ロード画面の描画はDXライブラリの関数を使用しないで行うのが正しいということでしょうか?
お手数ですがご確認よろしくお願いいたします。
|
Re: 初回例外について ( No.3 ) |
- 名前:管理人 日時:2016/10/13 00:41
> 初回の例外を確認するため、下記コードに書き換えた状態でデバッグを実行し、DXライブラリの画面以外をクリックして非アクティブ化すると発生するのですが、
> この状態では発生しませんでしょうか?
はい、載せていただいたコードを VisualStudio Express 2013 for Windows Desktop で実行して
DXライブラリの画面以外をクリックして非アクティブ化しても、VisualStudio の「出力」に
初回の例外は出力されませんでした
グラフィックスデバイスのドライバやサウンドデバイスのドライバなどが原因であることもあるので、
よろしければグラフィックスデバイスやサウンドデバイスのドライバの新バージョンがあるか等を
調べてみてください
> 複数のスレッドでDXライブラリの関数を使用した場合、動作の保証ができないということでしたが、
> つまり、マルチスレッドでロード画面を作成する場合、メインスレッドでDX_Init()とロードを実行し、
> ロード画面の描画はDXライブラリの関数を使用しないで行うのが正しいということでしょうか?
DXライブラリの関数を使用しないでDXライブラリが作成したウインドウへ描画をすることは難しいので、
どちらかというとDXライブラリを使用する場合はマルチスレッドでロード画面を作成することは
一般的にはできないと考えていただいた方が良いと思います
マルチスレッドを使用される目的がファイルの読み込み処理を行いつつ画面の動きは止めない為でしたら、
SetUseASyncLoadFlag を使用することでマルチスレッドを使用しなくても実現ができますので、
もしそうでしたら SetUseASyncLoadFlag を使用してみてください m(_ _)m
// 読み込み処理系の関数で非同期読み込みを行うかどうかを設定する( 非同期読み込みに対応している関数のみ有効 )
// ( TRUE:非同期読み込みを行う FALSE:非同期読み込みを行わない( デフォルト ) )
int SetUseASyncLoadFlag( int Flag ) ;
<SetUseASyncLoadFlag のリファレンスの解説>
https://dxlib.xsrv.jp/function/dxfunc_other.html#R21N1
 |
Re: 初回例外について ( No.4 ) |
- 名前:SHIN(解決) 日時:2016/10/14 15:10
お忙しい中、何度も質問に答えていただきありがとうございます。
>グラフィックスデバイスのドライバやサウンドデバイスのドライバなどが原因であることもあるので、
>よろしければグラフィックスデバイスやサウンドデバイスのドライバの新バージョンがあるか等を
>調べてみてください
調べたところ、サウンドドライバは最新バージョンでした。
グラフィックドライバは二つあり、片方が更新可能だったので更新してサンプルプログラムで例外が発生するかを確認しましたが、
例外の発生はなくなりませんでした。
ドライバ以外にも問題がないか再度件の初回例外について調べていくつか試していきたいと思います。
まだ少し調べただけですが、Windows10の最新の更新で出たバグが問題かもしれないとネット上に上がっているので色々と調査していきます。
本題のマルチスレッドロードの件ですが、
マルチスレッドによるロード画面の作成は一般的にはできないということですので
推薦のあったSetUseASyncLoadFlagを使用する方法で試してみました。
試したところ、無事ロード画面を表示しつつロードをすることができました。
何時も知識不足の私の質問に答えていただき誠にありがとうございます。
また、お忙しい中色々とお手数をおかけして申し訳ございませんでした。
また何かありましたらよろしくお願いいたします。
|
Re: 初回例外について ( No.5 ) |
- 名前:SHIN 日時:2016/10/14 21:57
解決済みとした所大変申し訳ございませんが、新たな疑問が出てきましたので
再度投稿させていただきます。
マルチスレッドについてですが、
私はDXライブラリと共にEffekseerというエフェクトツールを使用しております。
エフェクトツールのロードにも非同期読み込みがないかと質問したところ、
非同期読み込み機能はなく、DirectX9の初期化処理でマルチスレッドのフラグが立っていれば良いとのことでした。
そこでDXLibMakeを調査していくとSetMultThreadFlagという関数を見つけ、
それでマルチスレッドフラグを立てることが可能ということがわかりました。
新たな疑問とはこのマルチスレッドフラグを立てていればマルチスレッドで
他のロードを実行する事は可能ではないかということです。
実際、このフラグを立ててからプログラムを回して途中でエラーを起こすことは
今のところありません。
前回の回答でDXライブラリでマルチスレッドを実行するのは一般的ではないという事でしたが、
やはりこのフラグを立ててもプログラムとして安全ではないということでしょうか?
お手数ですが、ご教授よろしくお願いいたします。
|
Re: 初回例外について ( No.6 ) |
- 名前:管理人 日時:2016/10/15 00:44
> 前回の回答でDXライブラリでマルチスレッドを実行するのは一般的ではないという事でしたが、
> やはりこのフラグを立ててもプログラムとして安全ではないということでしょうか?
はい、安全ではありません
紛らわしくてすみません、SetMultiThreadFlag は Direct3D や DirectDraw を
マルチスレッド対応のモードで使用するかどうかを指定するためのもので、この設定と
DXライブラリ自体がマルチスレッドに対応するかどうかは別の問題となっていて、
SetMultiThreadFlag( TRUE ) ; を実行してもDXライブラリがマルチスレッドに
対応していないことに変わりはありません
|
Re: 初回例外について ( No.7 ) |
- 名前:SHIN(解決) 日時:2016/10/15 01:13
お忙しいな中、ご回答ありがとうございます。
安全ではないということなので、
DXライブラリ関連のロードは非同期読み込み、
エフェクトツールのロードはマルチスレッドで
対応していきたいと思います。
また、何かありましたらよろしくお願いいたします。
|