Забавное поведение Sleep()

Тема в разделе "WASM.WIN32", создана пользователем bers, 28 ноя 2008.

  1. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Добрый всем день (вечер, ночь).
    Пишу прогу с гуем на Qt 4, в которой активно используется com-порт. В функциях нижнего уровня работы с com-портом используются задержки, построенные на основе Sleep( n ).
    Проблема заключается в том, что на некоторых машинах программа работает ну очень медленно. Но... если запустить в фоне, например, Windows Media Player, все начинает работать как надо, т.е. на приемлимой скорости.
    Пробовал вообще выключать собственно работу с com-портом из функций (оставляя при этом задержки и прочий код) - ситуация не изменилась.
    Либо все дело в Sleep, либо в Qt-шном коде, либо в чем-то еще )). Может кто чего подскажет?

    P.S. Пробовал собрать тестовую программку, которая просто тупо в цикле выводит разную хрень с задержками - все работает на ура. Неужели все дело в Qt?
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Может это конечно совпадение, но я ревершу прогу, которая активно юзает QT, так вот часто при отладке, при срабатывании бряка, все гуи виснет(в смысле вообще все) пока не переключишься на другой рабочий стол ctrl-alt-del + регулярно вообще виснет вся граф система + клавиатура + мышь, а винамп при этом играет..

    add: когда ничего не отлаживается такого нет
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Один может попробовать timeBeginPeriod().
     
  4. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Не совсем понял фразу...

    Классы нижнего уровня (в частности, и класс работы с com-портом) у меня написаны на С++ без примесей Qt, поэтому не хотелось бы использовать там Qt-шные функции (если это имелось в виду в предыдущем посте).
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В предыдущем посте видимо имелось в виду, что вызов мультимедийной функ-и timeBeginPeriod(1) уменьшает интервал системного счетчика с обычных 10-15 мс до 1мс и соотв-но Sleep, GetTickCount и т.п.отсчитывают интервалы более точно. Возможно влияние винампа и связано с установкой timeBeginPeriod, попробуй сам ее вызвать и посмотри, что будет ;)
     
  6. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Sol_Ksacap, leo
    Благодарю, парни, - действительно заработало с этой функцией как надо. Буду разбираться подробнее )...
     
  7. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Но все же непонятно как другое приложение (тот же Media Player) повлияло на мое, ведь как гласит MSDN
    "The timeBeginPeriod function sets the minimum timer resolution for an application or device driver."
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    bers
    Таймер - общий ресурс, поэтому кто-бы его ни перенастроил влияет на всё и на драйвера и на все юзермодные приложения.
     
  9. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Ну вообще как-то странно, что программа влияет на работу других исполняющихся приложений...
    По хорошему точность, устанавливаемая данной функцией, должна все же быть "привязанной" только к текущей программе.
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    This function affects a global Windows setting. Windows uses the lowest value (that is, highest resolution) requested by any process. Setting a higher resolution can improve the accuracy of time-out intervals in wait functions. However, it can also reduce overall system performance, because the thread scheduler switches tasks more often. High resolutions can also prevent the CPU power management system from entering power-saving modes. Setting a higher resolution does not improve the accuracy of the high-resolution performance counter.