WaitForSingleObject(handle, INFINITE);

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 5 апр 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    INFINITE = 0xFFFFFFFF, то есть при гранулярности в миллисекунду соответствует интервалу в ~49,7 дней.

    В MSDN сказано, что "If dwMilliseconds is INFINITE, the function's time-out interval never elapses". И все-таки, будет ли ожидание действительно вечным, или все же не более 49,7 дней? Может быть более корректно писать

    while(WaitForSingleObject(handle, INFINITE) == WAIT_TIMEOUT);

    ?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Логично было бы предположить, что интервал действительно сделали вечным в порядке исключения для данного конкретного значния. Тут наверное реверсить системные функции надо.
    А к чему такая точность, если не секрет? Какого события ты собрался 50 дней ждать? :)))
     
  3. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    [deleted]
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MSoft

    Логично предположить, что винапи и msdn полны косяков :derisive:


    Да очень просто. Windows Service традиционно ждет евента на INFINITE, который сигналится по SERVICE_CONTROL_STOP. Получается если не сделать while, сервер будет останавливаться раз в 50 дней. Если вдруг получится так, что его никто за 50 дней не ребутнет, то для серьезного промышленного продукта это будет огромный косяк.
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    _DEN_
    А с чего ты взял, что 0xFFFFFFFF это количество миллисекунд.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    вечным.
    см. BaseFormatTimeOut().
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Partner

    Ну второй параметр ето какбе dwMilliseconds.


    dendi
    n0name
    Так все-таки? :)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name уже сказал - вечным.

    Код (Text):
    1. PLARGE_INTEGER
    2. BaseFormatTimeOut(
    3.     OUT PLARGE_INTEGER TimeOut,
    4.     IN DWORD Milliseconds
    5.     )
    6. {
    7.     if ( (LONG) Milliseconds == -1 ) {
    8.         return( NULL );
    9.         }
    10. ...
    11.   return Timeout;
    12. }
    Эта функция вызывается из Sleep(Ex) и WaitFor*** перед вызовом соотв. ZwApi.

    А передача NULL в качестве (PLARGE_INTEGER Timeout) делает ожидание вечным

    MSoft правильно угадал про конкретно данное значение)
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    INFINITE конвертится еще на стадии kernel32.dll, в исходнике этого и быть не может.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Great, n0name

    Понятно, спасибо.
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а мне? :)
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MSoft

    А тебе за что? :)
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я самый первый тебе правильный ответ дал :) А Грейт подтвердил. А еще я умный вопрос задал :)))