第一次海报,温文尔雅;-)
我正在编写一个音频应用程序(在C++中),它作为Windows服务运行,使用WASAPI从jack中的行中获取样本,并对其进行一些处理。
我注意到,当我的应用程序正在“录制”时,Windows不会自动挂起或休眠。
我已经注册了电源事件通知,如果我自己按下挂起按钮,我的服务将获得适当的电源事件并正常处理它们。如果我让系统自行挂起,则永远不会收到电源事件。
如果删除引用WASAPI的代码位,则在手动挂起和自动挂起时,电源事件都会正常接收。因此,似乎使用WASAPI会告诉Windows忽略自动挂起计时器。
有人可以帮助解释这种行为吗?我能做些什么来阻止它吗?我不希望我的应用程序成为那些行为不正常并阻止系统挂起的应用程序之一。
发布于 2009-04-09 12:03:41
非常感谢Larry证实了这种行为是故意的,而不是我做的傻事。
为了解决这个问题,我使用了Win32 CallNtPowerInformation()应用程序接口来检索系统空闲计时器:
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小时后系统待机”,并在CPU使用率(以百分比表示)超过spi.MaxIdlenessAllowed时重置。
如果spi.TimeRemaining达到零,系统应该已经进入睡眠状态,所以我关闭了所有的WASAPI句柄并让它这样做。
发布于 2009-03-17 02:01:17
不幸的是,没有任何机制可以做你想做的事情--打开一个音频流可以防止电源状态转换,就像在网络上打开一个文件一样。
这是音频驱动程序(portcls.sys)的一个功能,而不是WASAPI,并且不是Vista的新行为--我相信XP和Win2K有相似的行为(尽管电源状态转换在Vista上比XP和Win2K上更可靠,所以用户倾向于更依赖它们)。
在Windows7上,你可以使用"powercfg -requests“来查看系统的任何部分是否在阻止机器进入睡眠状态。有关这方面的更多信息,请访问here
发布于 2009-03-13 18:22:54
我相信在电源管理API中有一个功能,它允许应用程序告诉操作系统它不希望系统在一段时间内进入省电模式(我认为这是一个开/关类型的功能)。如果WASAPI中的某个对象正在调用该方法,则您可能无能为力。这对于硬件按钮行为是有意义的,因为电源管理服务不会根据电源模式的激活方式强制执行应用程序请求。
至于变通工作,我不知道。我可能尝试的一件事是从电源管理API读取省电超时信息,然后在系统接近省电阈值时暂停记录;我不知道这会有多难。祝好运。:)
https://stackoverflow.com/questions/641935
复制相似问题