RegisterWaitForSingleObject and UnregisterWaitEx
От: WinUser  
Дата: 26.05.09 19:46
Оценка:
Есть такой код (мой).
Смотрю что будет , если использовать
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

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.