Проблема с SetEvent и WaitForMultipleObjects
От: akatik_jr3  
Дата: 14.04.11 14:21
Оценка:
Добрый день.
У меня в цикле создается поток и я жду, используя WaitForMultipleObjects, что поток либо установить Event0, либо установит Event1, либо пройдет 300мс.
В лог я выдаю результат, который установил поток, и то, что словил WaitForMultipleObjects. Однако периодически эти результаты отличаются. В может быть причина? Код следующий:


typedef struct 
{
    HANDLE resEventUseTrue;  
    HANDLE resEventUseFalse;    //false, если IP не найден и его можно присваивать клиенту.
}
type_sendThread;

static void _sendThread (void* data)
{
    type_sendThread d = *(type_sendThread*)data;

    srand( GetCurrentThreadId () + (unsigned) time (NULL));
    u32 pos =  (rand () % 300);

    _log ("Thread: Sleep %d.", pos);
    Sleep (pos);

    if ((pos / 2) * 2 == pos)
    {
        _log ("Thread: Set use False.");
        SetEvent(d.resEventUseFalse);
    }
    else 
    {
        _log ("Thread: Set use True.");
        SetEvent(d.resEventUseTrue);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    while (1)
    {
    HANDLE hEvents[2];
    hEvents[0] = CreateEvent(NULL, false, false, NULL);
    hEvents[1] = CreateEvent(NULL, false, false, NULL);
    if (hEvents[0] == NULL || hEvents[1] == NULL)
    {
        AERROR ("Main: CreateEvent failed.");
        return true;
    }
    type_sendThread data;
    data.resEventUseTrue = hEvents[0];
    data.resEventUseFalse = hEvents[1];
  
    if (_beginthread (_sendThread, 0, &data) == -1) 
    {
        _log ("Main: _beginthread () failed.");
        return true;
    }

    DWORD res = WaitForMultipleObjects(2, hEvents, false, 300);
    if (res == WAIT_TIMEOUT)
    {
        // Вышли по timeout. 
        _log ("Main:  Timeout.");
    }
    else if (res == WAIT_OBJECT_0)
    {
        // Вышли по sendEvent для resEventTrue. 
        _log ("Main:   Set use True.");
    }
    else if (res == WAIT_OBJECT_0 + 1)
    {
        // Вышли по sendEvent для resEventFalse. 
        _log ("Main:   Set use False.");
    }
    else 
    {
        LOGINTBUG;
    }

    CloseHandle (hEvents[0]);
    CloseHandle (hEvents[1]);
    }

    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.