わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

スレッドの生成

スレッドの生成には、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 )






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。