解決なさったとの事で何よりなのですが、できれば原因と解決策を記載して頂けますか?
で、記載して頂いたコードで以下の行が気になりました。
> if(GetExitCodeThread(ThreadHandle, &ExCode) != STILL_ACTIVE){//スレッドが終了していれば
GetExitCodeThread の戻り値は BOOL だと思うのですが、この比較は有効なのでしょうか?
それと、わたしなりに再現コードを書いてみたのですが、私の環境では再現しませんでした。
※ テストコードを若干修正しました。
//- 以下、テストコード -//
// だいぶ形は違いますが、やろうとしていることは一緒だと思います。
#include <process.h>
#include "DxLib.h"
struct GraphicImage {
const char* filename;
bool load_done;
bool create_done;
void* data;
size_t data_size;
int handle;
};
GraphicImage graphic_image_list[] = {
{ "test.bmp", false, false, 0, 0, 0 },
{ "test.jpg", false, false, 0, 0, 0 },
{ "test.png", false, false, 0, 0, 0 },
// 以下適当にデータを追加してください。私は1000個まで確認しました。
};
const size_t graphic_image_list_max = sizeof(graphic_image_list) / sizeof(*graphic_image_list);
int loading_progress = 0;
bool quit_thread = false;
unsigned int __stdcall LoadGraphicFileThread( void *p )
{
for ( size_t i = 0; i < graphic_image_list_max; i++, loading_progress = i ) {
FILE* fp = fopen( graphic_image_list[i].filename, "rb" );
fseek( fp, 0, SEEK_END );
graphic_image_list[i].data_size = ftell( fp );
fseek( fp, 0L, SEEK_SET );
graphic_image_list[i].data = new unsigned char[graphic_image_list[i].data_size];
fread( graphic_image_list[i].data, graphic_image_list[i].data_size, 1, fp );
graphic_image_list[i].load_done = true;
fclose( fp );
if ( quit_thread )
break;
Sleep( 0 );
}
_endthreadex( 0 );
return 0;
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
SetWindowText( "DxLib:" DXLIB_VERSION_STR );
if ( DxLib_Init( ) == -1 ) return -1;
int white = GetColor( 255, 255, 255 );
unsigned int thread_id;
HANDLE thread_handle;
thread_handle = (HANDLE)_beginthreadex( NULL, 0, LoadGraphicFileThread, NULL, 0, &thread_id );
size_t loaded_graphic_counter = 0;
SetDrawScreen( DX_SCREEN_BACK );
while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
if ( loaded_graphic_counter >= graphic_image_list_max )
break;
if ( graphic_image_list[loaded_graphic_counter].load_done ) {
graphic_image_list[loaded_graphic_counter].handle = CreateGraphFromMem(
graphic_image_list[loaded_graphic_counter].data,
graphic_image_list[loaded_graphic_counter].data_size );
graphic_image_list[loaded_graphic_counter].create_done = true;
DeleteGraph( graphic_image_list[loaded_graphic_counter].handle ); // 読み込みすぎ対策
loaded_graphic_counter++;
}
ClearDrawScreen( );
DrawFormatString( 0, 0, white, "TEST %d/%d/%d",
loaded_graphic_counter, loading_progress, graphic_image_list_max );
ScreenFlip( );
}
WaitKey( );
quit_thread = true;
WaitForSingleObject( thread_handle, INFINITE );
CloseHandle( thread_handle );
DxLib_End( );
for ( size_t i = 0; i < graphic_image_list_max; i++ ) {
delete [] graphic_image_list[i].data;
}
return 0;
}