マルチスレッドを使ってロード画面を作ろうとしているのですが、
上手く画像が描画更新してくれません。
スレッドの中身は下記の通りです。よろしくお願いします。
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;
}
No.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になってループを抜けてしまっているとか)が分からないと何とも言えません。
プログラムがどこまで実行されていてそのときの変数の値がどうなっているか、デバッガを使って調べてみましたか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL php テーブルを作れない 2 2022/11/17 18:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
DirectX LPDIRECT3DDEVICE9のマ...
-
自作クラスのイベントを外部ハ...
-
マルチスレッドプログラム
-
マルチスレッドについて
-
.netアプリへのSendMessageでフ...
-
スレッドにて同一メモリの書き...
-
マルチスレッドプログラムでメ...
-
win32 スレッドのハンドルついて
-
緯度、経度の 10進法と 60進法...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
バックグラウンドのプロセスの...
-
Excelでのセル内容の高速消去方法
-
explorer.exeが異様にメモリを食う
-
C言語で、メモリを解放しないで...
-
VBSで応答不要のメッセージボッ...
-
MACで動く実行ファイルをWindow...
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
.netアプリへのSendMessageでフ...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
別スレッドからメインダイアロ...
-
マルチスレッドについて
-
マルチスレッドプログラミング...
-
別スレッドのデータを受信できない
-
特定のスレッドの破棄
-
.NetのBackgroundWorkerクラス...
-
msec単位のWait Timerが作れない!
おすすめ情報