プロが教える店舗&オフィスのセキュリティ対策術

ローディング画面をマルチスレッドで動かせません。

DirectXとC++をVisualStudio2010でゲームを制作しています。
ローディング画面を動かせるようにマルチスレッドにしているんですが、パソコンによってはローディング画面から動かなくなってしまいます。(開発環境では、問題なく動きます)

スレッドの呼び出し部分は以下のようになっています。
HANDLE thread;
CScene gamen; //タイトル画面やメインゲーム画面などのシーンを管理
void Loading()
{
SetDrawLoading( true );
delete gamen;
gamen = new CTitleGamen();
thread = (HANDLE)_beginthreadex(NULL,0,DrawLoading,NULL,0,NULL);
gamen->LoadData(); //クラス内の画像や音楽データを読み込み
effect->SetDrawLoading(false);
WaitForSingleObject( thread, INFINITE );
CloseHandle(thread);
}

マルチスレッド部分は以下のように、
drawLoading変数がtrueの間、ローディング画面を描画するようにしています。

D3DXMATRIX m_world;
unsigned __stdcall DrawLoading(void *p){
LPDIRECT3DTEXTURE9 pTexture;
D3DXCreateTextureFromFileEx(m_pD3DDevice, TEXT("texture.png"),16, 16, 0, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT,
D3DCOLOR_XRGB(255,255,0), NULL, NULL, &pTexture))

do{
m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
if( SUCCEEDED( m_pD3DDevice->BeginScene() ) ) {
D3DXMatrixIdentity( &m_world );
m_pD3DDevice->SetTransform( D3DTS_WORLD, &m_world );
m_pSprite->Begin( D3DXSPRITE_ALPHABLEND );
m_pSprite->Draw( pTexture, NULL, NULL,
&D3DXVECTOR3( timeGetTime()%800), 550, 0 ), 0xffffffff );
m_pSprite->End();
m_pD3DDevice->EndScene();
}
m_pD3DDevice->Present( 0, 0, 0, 0 );
}while( effect->GetDrawLoading() );

pTexture->Release();
_endthreadex(0);
return 0;
}

どなたか、ご教授お願い致します。

A 回答 (1件)

DirectXって初期化した以外のスレッドで描画デバイスを


呼び出しってやっちゃダメだった気がするのですが。。。
#過去の話かもしれませんが。

マルチスレッドにしているのだから、描画は
メインスレッドのみで行い、進捗状況の数値だけ
別スレッドで更新していくのが常套策だと思います。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!