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