none
系统唤醒问题 RRS feed

  • 问题

  • 窗口收到PBT_APMRESUMEAUTOMATIC事件后是不是表示程序已还原休眠前的状态,如:内存数据恢复,依赖dll恢复?从目前表现看在这个事件到达后经常会出现io读取异常,内存数据并不是休眠时的数据?请问windows下哪个事件可以表示当前应用真的已经恢复ok状态?
    2017年4月21日 8:39

答案

  • >>试过了,系统从休眠转到唤醒后还是会丢失部分地址数据?而且这部分数据都是内存地址,程序再次运行后访问的地址无效于是crash,请问该如何解决此问题?一般会在长时间休眠再次唤醒后出现。

    请问你有没有重新打开I/O端口文件? 你是具体什么操作导致了访问地址无效?

    像我之前说的,你的应用程序需要重新打开系统进入睡眠状态时关闭的文件,并准备用户输入。理论上你的应用程序所使用的内存地址应该是重新分配的,并不是之前保留的。应该不存在丢失地址数据的情况。

    详细内容可以参考以下文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa373235(v=vs.85).aspx

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    • 已编辑 Baron Bi 2017年5月8日 5:39
    • 已标记为答案 贾延辉 2017年5月24日 1:38
    2017年5月8日 5:38

全部回复

  • Hi 贾廷辉,

    感谢在MSDN论坛发帖。

    >>窗口收到PBT_APMRESUMEAUTOMATIC事件后是不是表示程序已还原休眠前的状态,如:内存数据恢复,依赖dll恢复?从目前表现看在这个事件到达后经常会出现io读取异常,内存数据并不是休眠时的数据?请问windows下哪个事件可以表示当前应用真的已经恢复ok状态?

    PBT_APMRESUMEAUTOMATIC事件仅仅 通知应用程序系统正在从睡眠或休眠状态恢复。每次系统恢复时都会传送此事件,并不表示用户是否存在。如果系统在广播PBT_APMRESUMEAUTOMATIC之后检测到任何用户活动,它将广播PBT_APMRESUMESUSPEND事件,以使应用程序知道他们可以恢复与用户的完全交互。

    你可以尝试使用PBT_APMRESUMESUSPEND事件通知暂停的应用程序,系统已经开始恢复操作了。可以读取内存数据了。

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Baron Bi 2017年4月24日 8:43
    2017年4月22日 2:30
  • 谢谢,您的答复,如果这样;

    那么在应用收到PBT_APMRESUMEAUTOMATIC后再send PBT_APMRESUMESUSPEND 那和现在情况也没啥差别?而且在用户按下电源键恢复时 系统会主动发送PBT_APMRESUMESUSPEND吗?

    2017年4月25日 1:18
  • >>那么在应用收到PBT_APMRESUMEAUTOMATIC后再send PBT_APMRESUMESUSPEND 那和现在情况也没啥差别?而且在用户按下电源键恢复时 系统会主动发送PBT_APMRESUMESUSPEND吗?

    如果只是发送了PBT_APMRESUMEAUTOMATIC事件,应用程序并不会进行用户交互。

    如果由于用户活动(如按电源按钮)系统唤醒,或者系统在无人看管后,在物理控制台(如鼠标或键盘输入)检测到用户交互,系统首先广播PBT_APMRESUMEAUTOMATIC事件,然后广播 PBT_APMRESUMESUSPEND事件。 系统打开显示屏。 应用程序应重新打开系统进入睡眠状态时关闭的文件,并准备用户输入。

    希望对你有所帮助。

    Best Regards
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年4月26日 9:05
  • 试过了,系统从休眠转到唤醒后还是会丢失部分地址数据?而且这部分数据都是内存地址,程序再次运行后访问的地址无效于是crash,请问该如何解决此问题?一般会在长时间休眠再次唤醒后出现。
    2017年5月2日 1:40
  • >>试过了,系统从休眠转到唤醒后还是会丢失部分地址数据?而且这部分数据都是内存地址,程序再次运行后访问的地址无效于是crash,请问该如何解决此问题?一般会在长时间休眠再次唤醒后出现。

    请问你有没有重新打开I/O端口文件? 你是具体什么操作导致了访问地址无效?

    像我之前说的,你的应用程序需要重新打开系统进入睡眠状态时关闭的文件,并准备用户输入。理论上你的应用程序所使用的内存地址应该是重新分配的,并不是之前保留的。应该不存在丢失地址数据的情况。

    详细内容可以参考以下文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa373235(v=vs.85).aspx

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    • 已编辑 Baron Bi 2017年5月8日 5:39
    • 已标记为答案 贾延辉 2017年5月24日 1:38
    2017年5月8日 5:38
  • 在唤醒之后从消息队列中获取到了新增绘图控件事件,然后程序临时打开xml文件读取数据并绘图,现在发现唤醒后这个绘制控件的父节点指向的内存是错误的。这个问题很奇怪。

    例如:休眠前绘图对象root_node,唤醒后从事件队列拿到在root_node节点下新增新的绘图节点,然后程序开始读取xml并生成节点,在这个过程中访问root_node的某个内存对象时候发生了异常,异常原因由于访问了无效地址。可该地址在休眠之前是可用的。

    理论上你的应用程序所使用的内存地址应该是重新分配的,并不是之前保留的;如果按照您这种推断,那么在休眠唤醒之后所有保存地址的指针都要进行获取地址?


    2017年5月15日 2:50
  • 这是休眠唤醒之后m_xml对象的数据是错的


    2017年5月15日 10:24
  • 坛主,帮忙看下呗
    2017年5月18日 9:32