プロセス間イベント

// 複数のプロセスで同じイベントを使うとき
//
// まず最初にCreateEventでイベントを作成し、
// 2つ目以降のプロセスで使うときはOpenEventで開く。

#define EVENT_NAME1 _T("EVENT_NAME1")

static HANDLE s_event1 = NULL;

//////////////////////////////////////////////////
// 作成
bool createEvent()
{
if(s_event1) return false;

const BOOL bManualReset = FALSE;// TRUE:手動リセット / FALSE:自動リセット
const BOOL bInitialState = FALSE;// TRUE:シグナル状態 / FALSE:非シグナル状態

s_event1 = ::CreateEvent(NULL, bManualReset, bInitialState, EVENT_NAME1);
if(!s_event1) return false;

return true;
}

//////////////////////////////////////////////////
// 破棄
bool deleteEvent()
{
HANDLE event1 = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENT_NAME1);
if(!event1) return false;

if(!::CloseHandle(event1)) return false;
event1 = NULL;

return true;
}

//////////////////////////////////////////////////
// 待機
bool waitEvent()
{
HANDLE event1 = ::OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME1);
if(!event1) return false;

const DWORD ret = ::WaitForSingleObject(event1, INFINITE);
switch(ret)
{
case WAIT_OBJECT_0:// ON
break;

case WAIT_TIMEOUT:// OFF
break;

case WAIT_ABANDONED:// 放棄 => OFF
break;

case WAIT_FAILED:// 失敗
default:
return false;
}

return true;
}

//////////////////////////////////////////////////
// ON
bool onEvent()
{
HANDLE event1 = ::OpenEvent(EVENT_MODIFY_STATE, FALSE, EVENT_NAME1);
if(!event1) return false;

if(!::SetEvent(event1)) return false;

return true;
}

//////////////////////////////////////////////////
// OFF
bool offEvent()
{
HANDLE event1 = ::OpenEvent(EVENT_MODIFY_STATE, FALSE, EVENT_NAME1);
if(!event1) return false;

if(!::ResetEvent(event1)) return false;

return true;
}
最終更新:2011年12月22日 14:28
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。