2009-03-13 3 views
0

Первый раз плакат, быть нежным ;-)WASAPI предотвращает автоматическое приостановку Windows?

Я пишу аудио приложения (в C++), который работает в качестве службы Windows, использует WASAPI для взятия проб из линии в гнезде, и делают некоторую обработку на нем ,

Что-то, что я заметил, это то, что когда мое приложение «записывает», Windows не будет автоматически приостанавливаться или спящий режим.

Я зарегистрировался для уведомлений о событиях питания и, если я сам нажму кнопку suspend, моя служба получает соответствующие события питания и обрабатывает их в порядке. Если я оставляю систему самостоятельно приостановленной, события питания никогда не принимаются.

Если я удаляю биты кода, где я ссылаюсь на WASAPI, события питания принимаются как обычно как вручную, так и автоматически приостанавливаются. Похоже, что есть что-то об использовании WASAPI, которое сообщает Windows игнорировать автоматический таймер приостановки.

Может ли кто-нибудь помочь объяснить это поведение, и есть ли что-нибудь, что я могу сделать, чтобы остановить его? Я не хочу, чтобы мое приложение было одним из тех, кто неправильно управляет и предотвращает приостановку систем.

ответ

2

Большое спасибо Ларри за подтверждение этого поведения по дизайну, а не за то, что я делаю что-то глупое.

Чтобы обойти эту проблему, я использовал Win32 CallNtPowerInformation() API для извлечения системы холостого хода таймера:

SYSTEM_POWER_INFORMATION spi = {0}; 
NTSTATUS status = CallNtPowerInformation(SystemPowerInformation, NULL, 0, 
             &spi, sizeof(spi)); 

if (NT_SUCCESS(status) && (spi.TimeRemaining==0)) 
{ 
    // should have gone to sleep 
} 

spi.TimeRemaining член отсчитывает (в секундах) с момента, указанного пользователем в панели управления, например «Ожидание системы через 1 час» и сбрасывается всякий раз, когда загрузка процессора (в процентах) возрастает выше spi.MaxIdlenessAllowed.

Если spi.TimeRemaining когда-либо достигает нуля, система должна ушла спать, поэтому я закрываю все свои ручки WASAPI и позволяю им это делать.

0

Я считаю, что есть функция в API управления питанием, которая позволяет приложению сообщать ОС, что она не хочет, чтобы систему, чтобы перейти в режим энергосбережения в течение некоторого времени (я думаю, что это функция включения/выключения). Если что-то в WASAPI вызывает этот метод, вы ничего не можете сделать. Это имеет смысл с поведением аппаратной кнопки, поскольку служба управления питанием не вынуждена выполнять запрос приложения в зависимости от того, как активирован режим питания.

Что касается работы, я не знаю. Одна вещь, которую я могу попробовать, - прочитать информацию тайм-аута энергосбережения из API управления питанием, а затем приостановить запись, если система приближается к порогу экономии энергии; Я понятия не имею, как это было бы тяжело. Удачи. :)

0

Одна вещь, которую я могу попробовать, - прочитать информацию об энергосберегающем тайм-ауте из API управления питанием, а затем приостановить запись, если система приближается к порогу экономии энергии;

Хорошая идея - но довольно сложно думаю. Тайм-аут энергосбережения должен читаться с использованием API управления питанием, но вам также необходимо знать текущее состояние входа пользователя, которое невозможно прочитать из службы Windows.

5

К сожалению, нет механизма для того, чтобы делать то, что вы хотите - открытие аудиопотока предотвращает переходы состояния питания, как открытие файла по сети и любой другой вещи.

Это функция аудиодрайвера (portcls.sys), а не WASAPI и не является новым поведением для Vista. Я считаю, что XP и Win2K были похожими поведением (хотя переходы состояния питания намного более надежны в Vista, чем они были на XP и Win2K, поэтому пользователи больше зависят от них).

В Windows 7 вы можете использовать «powercfg -requests», чтобы определить, не попали ли какие-либо части системы в режим сна. Более подробную информацию об этом можно найти here

+0

Я не знал о переключателе -requests. Большое спасибо! Большой поклонник здесь. ;) – macbirdie

Смежные вопросы