【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

私はいまマルチスレッドの勉強をしているのですが、ビルドが通るのに実行結果がおかしい状況に陥っています。
ロード画面の処理なのですが、プライマリスレッドでロード画面を描画し、セカンダリスレッドでロード処理を行おうとしています。
問題は、ロードが途中で止まることとロード画面を描画できません。
多分下記の関数が悪いとは思うのですがどうか、ご助力おねがいします。

HRESULT GameMain::LoadScreen()
{
// スレッドの生成
static bool onlyonce_createthread = FALSE;
if(onlyonce_createthread ==FALSE)
{
hTh = (HANDLE)_beginthreadex(
NULL,
0,
&loadthread,
this,
0,
(unsigned*)&thID );
onlyonce_createthread =TRUE;
}
// ローディング画面の描画
static bool loopflg = TRUE;
while(loopflg)
{
int threadCondition = CheckThread( hTh );
switch(threadCondition)
{
case THREAD_RUNNING:
if(graphloaded_flg ==TRUE)
{
EnterCriticalSection( &m_criticalSection );
float keep_item = (float)(load_item/MAX_LOAD_ITEM);
LeaveCriticalSection( &m_criticalSection );
d2d_control->GaugeDraw(0, 0, keep_item);
}
break;
case THREAD_EXIT:
loopflg =FALSE;
break;
case THREAD_ERROR:
return E_FAIL;
break;
}
}
float keep_item = (float)(load_item/MAX_LOAD_ITEM);
d2d_control->GaugeDraw(0, 0, keep_item);

return S_OK;
}

A 回答 (2件)

>ロード画面を描画できません。



GaugeDrawというのがどういう処理なのか分からないのでなんとも言えませんが、ダブルバッファにしていると仮定すれば、描画更新処理がなされていないように思います。

>ロードが途中で止まる

については不明です。途中まで読み込まれているのをデバッガで確認できているなら
そのロード関数(loadthreadかな)に問題があるでしょうね。
    • good
    • 0

上記のコードだと、threadConditionがTHREAD_RUNNINGでgraphloaded_flgがFALSEの間プライマリスレッドがビジーループになってしまいます。


graphloaded_flgの値はセカンダリスレッドが変更するのだと思いますが、プライマリスレッドにCPU時間を取られてセカンダリスレッドの実行がなかなか進まなくなっている可能性があります(特にCPUが1コアしかない場合)。
プライマリスレッドでgraphloaded_flg!=TRUEのときに100ミリ秒くらいスリープしたらどうなりますか?
    • good
    • 0
この回答へのお礼

プライマリスレッドにスリープを入れてみたところロードのほうは上手くいきました。
ご助言ありがとうございます。

お礼日時:2010/03/24 20:45

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