我有一个用 golang 编写的应用程序(部分),作为其操作的一部分,它将生成一个外部进程(用 c 编写)并开始监视。这个外部过程可能需要几个小时才能完成,因此我正在寻找一种方法来防止机器在处理时休眠或休眠。
我希望能够放弃这个锁,以便当进程完成时允许机器睡眠/休眠
我最初的目标是 Windows,但跨平台解决方案将是理想的(nix 甚至休眠吗?)。
感谢 Anders 为我指明了正确的方向 - 我在 golang 中整理了一个最小的示例(见下文)。
注意:轮询重置计时器似乎是唯一可靠的方法,我发现当尝试与连续标志结合时,它只会生效大约 30 秒(不知道为什么),话虽如此,在这个例子中轮询是过度的并且可能会增加到 10 分钟(因为最短休眠时间为 15 分钟)
另外仅供参考,这是一个 Windows 特定示例:
package main
import (
"log"
"syscall"
"time"
)
// Execution States
const (
EsSystemRequired = 0x00000001
EsContinuous = 0x80000000
)
var pulseTime = 10 * time.Second
func main() {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
setThreadExecStateProc := kernel32.NewProc("SetThreadExecutionState")
pulse := time.NewTicker(pulseTime)
log.Println("Starting keep alive poll... (silence)")
for {
select {
case <-pulse.C:
setThreadExecStateProc.Call(uintptr(EsSystemRequired))
}
}
}
上面的内容在 win 7 和 10 上进行了测试(尚未在 Win 8 上进行测试 - 推测也可以在那里工作)。
任何用户的睡眠请求都将覆盖此方法,这包括关闭笔记本电脑盖子等操作(除非电源管理设置更改为默认值)
以上是我的应用程序的明智行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)