Win32並行処理プログラミング入門21
並行プログラミングでは、「他のスレッドで初期化処理が終わった」などといった情報を知りたい場合があります。その場合は、イベントを使用します。使用方法は簡単ですが、注意するべき点もありますので、サンプルとともに解説します。
/***************************************************************
//イベントを使用したいだけのサンプル
****************************************************************/
#include <iostream>
#include <string>
#include <windows.h>
#include <WinBase.h>
#include <tchar.h>
#include <process.h>
using namespace std;
//イベントハンドル
HANDLE hEvent;
//メッセージを保持するクラス
class Message
{
private:
string msg;
public:
Message() : msg( "" ) {};
void set_Message( string msg ) { this->msg = msg; };
string get_Message() const { return this->msg; }
}msg;
//指定されたメッセージをコンソールへ出力し続ける関数
unsigned __stdcall MessageOutput( void* )
{
while( - 1 ) {
//データが初期化されるまで待つ
DWORD result = WaitForSingleObject( hEvent, INFINITE );
//エラーがあれば表示
if ( result == WAIT_FAILED ) {
DWORD error = GetLastError();
LPVOID title = _T( "エラー" );
LPVOID msg;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
__nullptr,
error,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
reinterpret_cast< LPTSTR >( &msg ),
0,
__nullptr
);
MessageBox( __nullptr,
reinterpret_cast< LPCTSTR >( msg ) ,
reinterpret_cast< LPCTSTR >( title ),
MB_OK | MB_ICONERROR );
LocalFree( msg );
return -1;
}
//データを出力
cout << msg.get_Message() << " ";
//出力スピードを遅くする
Sleep( 50 );
}
return 0;
}
//イベントを使用して出力処理を制御する
int _tmain( int, _TCHAR* )
{
//CreateEventの場合
/*hEvent = CreateEvent(
__nullptr,
TRUE,
FALSE,
_T("piyo") );*/
//CreateEventExの場合
hEvent = CreateEventEx(
0,
_T("piyo"),
CREATE_EVENT_MANUAL_RESET,
EVENT_MODIFY_STATE | SYNCHRONIZE );
//スレッドを作成
HANDLE hThread = reinterpret_cast< HANDLE >(
_beginthreadex (
__nullptr,
0U,
MessageOutput,
__nullptr,
0,
__nullptr ) );
//データを準備する
msg.set_Message( "Hello,Event!" );
//準備が終了した事を知らせる
SetEvent( hEvent );
//何かの処理をしている・・・
Sleep( 1000 );
//また準備する・・・
ResetEvent( hEvent );
cout << endl << endl
<< "メッセージを変更中・・・"
<< endl << endl;
Sleep( 1000 );
msg.set_Message( "ピヨ" );
SetEvent( hEvent );
//また何かの処理をしている・・・
Sleep( 1000 );
//出力を終える
ResetEvent( hEvent );
cout << endl << endl
<< "ピヨはもういい。"
<< endl << endl;
//後片付け
CloseHandle( hEvent );
CloseHandle( hThread );
return 0;
}
ちょっと長いですが、やっている事は非常に単純です。新しいスレッドを作成し、そのスレッドに文字列を表示させ続けているだけです。なお、文字列は共有リソースが保持しています。詳しい説明は次回します。続く...