スレッドの生成には、CreateThreadなど、いくつか生成方法がありますが、_beginthreadexが安全で確実のようです。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <process.h> #include <windows.h> /* スレッドメイン処理 */ unsigned __stdcall ThreadMain ( void* vpArguments ) { std::wcout << L"スレッド開始( 引数 = " << (int)vpArguments << L" )" << std::endl; /* スレッドメイン処理 */ for ( UINT nI = 0; nI < 10; nI++ ) { std::wcout << L"スレッド処理中( " << nI << L" )" << std::endl; // 1秒待ち ::Sleep( 1000 ); } /* スレッドの終了 この値はGetExitCodeThread()で取得できる */ std::wcout << L"スレッド終了" << std::endl; ::_endthreadex( 1234 ); // 処理結果 return( 0 ); } /* スレッドの生成 */ int _tmain ( int argc , _TCHAR* argv[] ) { /* std::wcoutのロケールを設定 これを設定するだけで、std::wcoutで日本語が表示される ようになります。 */ std::wcout.imbue( std::locale( "", std::locale::ctype ) ); UINT nThreadId = 0; // スレッド起動 HANDLE hThread = (HANDLE)::_beginthreadex( NULL // SECURITY_ATTRIBUTES構造体 , 0 // スタックサイズ( 0は呼び出し側と同じサイズ ) , &ThreadMain // スレッド関数 , (void*)12345678 // スレッド関数への引数 , 0 // 作成オプション( 0 / CREATE_SUSPENDED ) , &nThreadId // スレッドId ); std::wcout << L"スレッド起動 Id = " << nThreadId << std::endl; // スレッドの終了待ち ::WaitForSingleObject( hThread, INFINITE ); DWORD dwExitCode = 0; // スレッドの終了コードを取得 ::GetExitCodeThread( hThread, &dwExitCode ); std::wcout << L"スレッド終了コード( " << dwExitCode << L" )" << std::endl; // スレッドハンドルの解放 ::CloseHandle( hThread ); // 処理結果 return( 0 ); }
スレッド起動 Id = 12976 スレッド開始( 引数 = 12345678 ) スレッド処理中( 0 ) スレッド処理中( 1 ) スレッド処理中( 2 ) スレッド処理中( 3 ) スレッド処理中( 4 ) スレッド処理中( 5 ) スレッド処理中( 6 ) スレッド処理中( 7 ) スレッド処理中( 8 ) スレッド処理中( 9 ) スレッド終了 スレッド終了コード( 1234 )