Re: RegisterWaitForSingleObject and UnregisterWaitEx
От: meerius Канада  
Дата: 27.05.09 06:28
Оценка:
Здравствуйте, 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

Компилятор не ругается, а предупреждает Вас, что бы обратили внимание на эти строки, еще раз проверили, и если все нормально, сделали приведение типов явно, тем самым указывая ему, что Вы точно уверены в том что делаете.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.