Есть такой код (мой).
Смотрю что будет , если использовать
1. Сбрасываемое вручную событие
2. Сбрасываемое автоматически
#include "stdafx.h"
using std::wcout;
using std::endl;
using std::hex;
using std::dec;
#ifndef BEGIN_NAMESPACE
#define BEGIN_NAMESPACE(x)
#define END_NAMESPACE(x)
#endif
BEGIN_NAMESPACE(REGISTEROBJECT)
VOID WINAPI RegCallBack(PVOID pvContext,BOOLEAN)
{
Sleep(1000);
VOID* pointer = pvContext;
wcout << GetCurrentThreadId() << L" " << (DWORD)pvContext <<L"\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
const DWORD SOME_NUM = 10;
HANDLE hEventAr[SOME_NUM];
HANDLE hReg[SOME_NUM];
BOOL bAutoReset = TRUE;//FALSE;
for(DWORD i=0;i<SOME_NUM;++i)
{
hEventAr[i] = CreateEvent(0,!bAutoReset,FALSE,0);
wcout << L"bOK = " << ::RegisterWaitForSingleObject(&hReg[i],hEventAr[i],&RegCallBack,(PVOID)i,-1,WT_EXECUTEINWAITTHREAD) << L"\n";
}
SetEvent(hEventAr[0]);
wcout << L"RetWait : " << UnregisterWaitEx(hReg[0],(HANDLE)(-1)) << L" Error : " << GetLastError() << L"\n";
/*
Unregister...
CloseHandle..
*/
return 0;
}
END_NAMESPACE
в 1 (вручную) случае "цикл"
в 2 (авто) случае после первого сброса выполнение кэллбэка только один раз
Как-то флаги на это влияют?(Register...)
Почему?(не понимаю почему во втором случае сразу возвращает управление Unreg...)
п.с. ругается на приведение PVOID<->DWORD У меня из размеры равны оба 4 байтам.В чем проблема?
warning C4311: 'type cast' : pointer truncation from 'PVOID' to 'DWORD'
warning C4312: 'type cast' : conversion from 'DWORD' to 'PVOID' of greater size
Спасибо.