アプリ版:「スタンプのみでお礼する」機能のリリースについて

マルチスレッドを使ってロード画面を作ろうとしているのですが、
上手く画像が描画更新してくれません。
スレッドの中身は下記の通りです。よろしくお願いします。
HRESULT GameMain::LoadScreen()
{
// スレッドの生成
static bool onlyonce_createthread = FALSE;
if(onlyonce_createthread ==FALSE)
{
hTh = (HANDLE)_beginthreadex(
NULL, // SECURITY_ATTRIBUTES 構造体へのポインタ
0, // 新規スレッドのスタックサイズ
&loadthread,// スレッドの実行開始アドレス
this, // 新規スレッドに渡される引数リスト
0, // 新規スレッドの初期状態
(unsigned*)&thID );// スレッドのIDを格納するためのDWORD型変数へのポインタ
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 );
load_item = (float)(load_item/MAX_LOAD_ITEM);
LeaveCriticalSection( &m_criticalSection );
d2d_control->GaugeDraw(0, 0, load_item);
Sleep(100);
}
break;
case THREAD_EXIT:
loopflg =FALSE;
break;
case THREAD_ERROR:
return E_FAIL;
break;
}
}
return S_OK;
}

A 回答 (1件)

・d2d_control->GaugeDraw(0, 0, load_item);の行は実行されていますか?


・そのときのload_itemの値はどうなっていますか?

見るからに怪しいのがload_item = (float)(load_item/MAX_LOAD_ITEM);の部分です。load_itemの値がMAX_LOAD_ITEMの値よりも小さい場合、割り算を繰り返すうちにload_itemの値がどんどん0に近付いていきます。それは意図通りですか?

もう一つ、threadCondition==THREAD_RUNNING かつ graphloaded_flg!=TRUE のとき、ビジーループになってしまっています。Sleep(100);を入れる場所を変えて下さい。while()ループの先頭、CheckThread()を呼ぶ前あたりがいいんじゃないでしょうか。
本当ならSleepしながら別スレッドの状態をチェックするのではなく、適切な同期機構を使ってスレッド間のイベント通知を行うべきです。

これ以上のことは、別スレッドの処理内容や、「上手く画像が描画更新してくれません」の具体的な症状(メインスレッドがEnterCriticalSection()のところで止まってしまってその後の処理に進めないとか、描画する前にTHREAD_EXITになってループを抜けてしまっているとか)が分からないと何とも言えません。
プログラムがどこまで実行されていてそのときの変数の値がどうなっているか、デバッガを使って調べてみましたか?
    • good
    • 0
この回答へのお礼

数値の変動のところを確認してみると変数の値が変わってませんでした。
お手数をおかけしました。
ありがとうございます。

お礼日時:2010/04/20 19:56

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