Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to prevent Windows from entering in hibernate/sleep mode
Forum Updated to NodeBB v4.3 + New Features

How to prevent Windows from entering in hibernate/sleep mode

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 4 Posters 2.5k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • franco.amatoF franco.amato

    I have a Qt application that periodically performs some checks using a video camera (it takes and processes an image every second). I need Windows to be active without going into hibernation nor sleep mode as long as the application is running and to achieve it I have added the following code fragment in the main.cpp file of my application

    // ... previous code omitted
    // From documentation, it should inform the o.s. that the app is in use preventing it to hibernate or sleep
    SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
    
    // Execute the main application
    LoginDialog loginDialog(!appMode);
    int result = loginDialog.proceed() ? application.exec() : 0;
    
    // Restore to the previous state when the app closes
    SetThreadExecutionState(ES_CONTINUOUS);
    
    return result;
    

    Unfortunately this approach is not giving the desired effects and after some time it hibernates and I don't understand why. Unfortunately I can't run the program with administrator privileges and this could be the cause but I'm not sure. I would like some help in solving my problem.

    C Offline
    C Offline
    ChrisW67
    wrote on last edited by
    #2

    @franco-amato said in How to prevent Windows from entering in hibernate/sleep mode:

    SetThreadExecutionState(...)

    You are not checking the return value to see if this is succeeding.

    The vaguely worded Microsoft docs might provide a clue:

    Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionState periodically.

    It is not clear what would change the thread execution state after you set it.

    You may need to ensure this is called "periodically" (whatever that means). You could try it in a Qt timer slot or even a do-nothing native event filter (QCoreApplication::installNativeEventFilter) and see how it flies.

    franco.amatoF 1 Reply Last reply
    1
    • C ChrisW67

      @franco-amato said in How to prevent Windows from entering in hibernate/sleep mode:

      SetThreadExecutionState(...)

      You are not checking the return value to see if this is succeeding.

      The vaguely worded Microsoft docs might provide a clue:

      Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionState periodically.

      It is not clear what would change the thread execution state after you set it.

      You may need to ensure this is called "periodically" (whatever that means). You could try it in a Qt timer slot or even a do-nothing native event filter (QCoreApplication::installNativeEventFilter) and see how it flies.

      franco.amatoF Offline
      franco.amatoF Offline
      franco.amato
      wrote on last edited by
      #3

      @ChrisW67 said in How to prevent Windows from entering in hibernate/sleep mode:

      You are not checking the return value to see if this is succeeding.

      What should I do in case of failure?

      You may need to ensure this is called "periodically" (whatever that means). You could try it in a Qt timer slot

      Just calling SetThreadExecutionState in a timer slot? With what arguments?

      or even a do-nothing native event filter (QCoreApplication::installNativeEventFilter) and see how it flies.

      Can you help with some code?

      C 1 Reply Last reply
      0
      • franco.amatoF franco.amato

        @ChrisW67 said in How to prevent Windows from entering in hibernate/sleep mode:

        You are not checking the return value to see if this is succeeding.

        What should I do in case of failure?

        You may need to ensure this is called "periodically" (whatever that means). You could try it in a Qt timer slot

        Just calling SetThreadExecutionState in a timer slot? With what arguments?

        or even a do-nothing native event filter (QCoreApplication::installNativeEventFilter) and see how it flies.

        Can you help with some code?

        C Offline
        C Offline
        ChrisW67
        wrote on last edited by
        #4

        @franco-amato said in How to prevent Windows from entering in hibernate/sleep mode:

        What should I do in case of failure?

        Nothing, but you know that, for whatever reason, your application cannot rely on not being put to sleep. You choose whether to keep running... or try to work out why it failed and correct the code/environment (I cannot see why it should fail).

        Just calling SetThreadExecutionState in a timer slot? With what arguments?

        The same ones (assuming this call is not presently failing)

        Can you help with some code?

        I'd try the timer first. Probably seconds in between.

        Something like this (untested) will call it constantly (probably overkill)

        #include <QAbstractNativeEventFilter>
        
        // Filter used to call SetThreadExecutionState every time the application receives an event
        // Passes all events untouched
        class KeepAwakeFilter : public QAbstractNativeEventFilter
        {
        public:
            bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override
            {
                Q_UNUSED(eventType);
                Q_UNUSED(message);
                Q_UNUSED(result);
        
                SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
                return false;
            }
        };
        
        // then in main.cpp or somewhere equivalent
        KeepAwakeFilter keepAwakeFilter;
        app.installNativeEventFilter(&keepAwakeFilter);
        
        // and just before you leave main and destroy keepAwakeFilter and app
        app.removeNativeFilter(&keepAwakeFilter);
        
        franco.amatoF 1 Reply Last reply
        0
        • C ChrisW67

          @franco-amato said in How to prevent Windows from entering in hibernate/sleep mode:

          What should I do in case of failure?

          Nothing, but you know that, for whatever reason, your application cannot rely on not being put to sleep. You choose whether to keep running... or try to work out why it failed and correct the code/environment (I cannot see why it should fail).

          Just calling SetThreadExecutionState in a timer slot? With what arguments?

          The same ones (assuming this call is not presently failing)

          Can you help with some code?

          I'd try the timer first. Probably seconds in between.

          Something like this (untested) will call it constantly (probably overkill)

          #include <QAbstractNativeEventFilter>
          
          // Filter used to call SetThreadExecutionState every time the application receives an event
          // Passes all events untouched
          class KeepAwakeFilter : public QAbstractNativeEventFilter
          {
          public:
              bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override
              {
                  Q_UNUSED(eventType);
                  Q_UNUSED(message);
                  Q_UNUSED(result);
          
                  SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
                  return false;
              }
          };
          
          // then in main.cpp or somewhere equivalent
          KeepAwakeFilter keepAwakeFilter;
          app.installNativeEventFilter(&keepAwakeFilter);
          
          // and just before you leave main and destroy keepAwakeFilter and app
          app.removeNativeFilter(&keepAwakeFilter);
          
          franco.amatoF Offline
          franco.amatoF Offline
          franco.amato
          wrote on last edited by
          #5

          @ChrisW67 said in How to prevent Windows from entering in hibernate/sleep mode:

          Nothing, but you know that, for whatever reason, your application cannot rely on not being put to sleep. You choose whether to keep running... or try to work out why it failed and correct the code/environment (I cannot see why it should fail).

          Unfortunately if the call to SetThreadExecutionState fails and Windows enter in Hibernation/Sleep mode, my app stops capturing from camera and I don't know how to do to keep it running in this case. Do you have any suggestion?

          C 1 Reply Last reply
          0
          • JonBJ Online
            JonBJ Online
            JonB
            wrote on last edited by
            #6

            I hope you are not allowed to do this! Certainly without some kind of special privileges/run as administrator or similar. Otherwise user-level programs can be written by whoever which will prevent my PC sleeping/hibernating, which I would hope would be forbidden.

            1 Reply Last reply
            0
            • franco.amatoF franco.amato

              @ChrisW67 said in How to prevent Windows from entering in hibernate/sleep mode:

              Nothing, but you know that, for whatever reason, your application cannot rely on not being put to sleep. You choose whether to keep running... or try to work out why it failed and correct the code/environment (I cannot see why it should fail).

              Unfortunately if the call to SetThreadExecutionState fails and Windows enter in Hibernation/Sleep mode, my app stops capturing from camera and I don't know how to do to keep it running in this case. Do you have any suggestion?

              C Offline
              C Offline
              ChrisW67
              wrote on last edited by
              #7

              @JonB. On one level I agree with you. On another, things like presentation apps routinely block both screen blanking and hibernation. There is nothing in the docs I see that specified admin rights are required e.g., System Sleep Criteria. The docs do say that none of these measures block a user from taking affirmative action to sleep/hibernate/shutdown e.g., with the power button or closing a laptop cover.

              @franco-amato You have not disclosed if the call is, in fact, failing.

              If it is failing, then does it work if you run your application as admin? Yes, then you must need these permissions.

              1 Reply Last reply
              1
              • Chris KawaC Offline
                Chris KawaC Offline
                Chris Kawa
                Lifetime Qt Champion
                wrote on last edited by Chris Kawa
                #8

                You don't usually need a timer for this. ES_CONTINUOUS means "I need the state of the specified flags preserved until I clear them". If you specify it you don't need a timer. If you don't then you should call the function periodically. I would use a sparse timer for this (every couple of seconds I'd say). There's no need to spam the system with it on every native event callback.

                That being said take care which flags you actually specify. If you need the display running use ES_DISPLAY_REQUIRED, but combining it with ES_AWAYMODE_REQUIRED doesn't make much sense. The away mode makes the computer to go to a sleep-like state that still allows it to perform some background tasks. That's not what you'd do if you need display to be on.

                Keep in mind though, that this function doesn't prevent computer from going to sleep. It only resets/stops the automatic sleep timer. The user can still make the computer go to sleep manually. To prevent that you'd have to actually change the power saving settings of the system, and for that you do need admin rights.

                And yes, do check return values of your system calls!

                @JonB It's quite normal for an app to prevent sleep/hibernation in specific scenarios, and no special privileges are required for that. You wouldn't want your computer to go to sleep when you're watching a movie, in the middle of printing a long document or at 99% of a large download that doesn't handle resuming for example. It's just that these states should only be enabled for the duration of these actions and (usually) not for the entire app lifetime.

                JonBJ franco.amatoF 2 Replies Last reply
                0
                • Chris KawaC Chris Kawa

                  You don't usually need a timer for this. ES_CONTINUOUS means "I need the state of the specified flags preserved until I clear them". If you specify it you don't need a timer. If you don't then you should call the function periodically. I would use a sparse timer for this (every couple of seconds I'd say). There's no need to spam the system with it on every native event callback.

                  That being said take care which flags you actually specify. If you need the display running use ES_DISPLAY_REQUIRED, but combining it with ES_AWAYMODE_REQUIRED doesn't make much sense. The away mode makes the computer to go to a sleep-like state that still allows it to perform some background tasks. That's not what you'd do if you need display to be on.

                  Keep in mind though, that this function doesn't prevent computer from going to sleep. It only resets/stops the automatic sleep timer. The user can still make the computer go to sleep manually. To prevent that you'd have to actually change the power saving settings of the system, and for that you do need admin rights.

                  And yes, do check return values of your system calls!

                  @JonB It's quite normal for an app to prevent sleep/hibernation in specific scenarios, and no special privileges are required for that. You wouldn't want your computer to go to sleep when you're watching a movie, in the middle of printing a long document or at 99% of a large download that doesn't handle resuming for example. It's just that these states should only be enabled for the duration of these actions and (usually) not for the entire app lifetime.

                  JonBJ Online
                  JonBJ Online
                  JonB
                  wrote on last edited by
                  #9

                  @Chris-Kawa
                  I respect what you guys are saying. OTOH I wouldn't want my computer not to go to sleep because for no particular reason the author of some program fancied putting in a system call to say "busy/don't sleep" when they want to endlessly poll, put up some advertising, don't know what they are doing or a thousand other possibilities. Since Windows allows this I can only hope Linux does not. I believe, from what I have seen on this forum, that Android would not allow that willy-nilly and would be strict about necessary privileges. Ho-hum.

                  Chris KawaC 1 Reply Last reply
                  0
                  • JonBJ JonB

                    @Chris-Kawa
                    I respect what you guys are saying. OTOH I wouldn't want my computer not to go to sleep because for no particular reason the author of some program fancied putting in a system call to say "busy/don't sleep" when they want to endlessly poll, put up some advertising, don't know what they are doing or a thousand other possibilities. Since Windows allows this I can only hope Linux does not. I believe, from what I have seen on this forum, that Android would not allow that willy-nilly and would be strict about necessary privileges. Ho-hum.

                    Chris KawaC Offline
                    Chris KawaC Offline
                    Chris Kawa
                    Lifetime Qt Champion
                    wrote on last edited by Chris Kawa
                    #10

                    @JonB said:

                    because for no particular reason the author of some program fancied putting in a system call to say "busy/don't sleep"

                    It's not like a virus. It's not a hidden feature. If an app does something stupid with it there's nothing stopping you from uninstalling it or not installing it in the first place. Like I said - the app can't stop your PC from going to sleep. It stops it from automatically going to sleep.

                    I wouldn't want my computer not to go to sleep

                    So you'd rather move your mouse constantly for 2h when watching a movie? Or run your video player with sudo?

                    1 Reply Last reply
                    0
                    • Chris KawaC Chris Kawa

                      You don't usually need a timer for this. ES_CONTINUOUS means "I need the state of the specified flags preserved until I clear them". If you specify it you don't need a timer. If you don't then you should call the function periodically. I would use a sparse timer for this (every couple of seconds I'd say). There's no need to spam the system with it on every native event callback.

                      That being said take care which flags you actually specify. If you need the display running use ES_DISPLAY_REQUIRED, but combining it with ES_AWAYMODE_REQUIRED doesn't make much sense. The away mode makes the computer to go to a sleep-like state that still allows it to perform some background tasks. That's not what you'd do if you need display to be on.

                      Keep in mind though, that this function doesn't prevent computer from going to sleep. It only resets/stops the automatic sleep timer. The user can still make the computer go to sleep manually. To prevent that you'd have to actually change the power saving settings of the system, and for that you do need admin rights.

                      And yes, do check return values of your system calls!

                      @JonB It's quite normal for an app to prevent sleep/hibernation in specific scenarios, and no special privileges are required for that. You wouldn't want your computer to go to sleep when you're watching a movie, in the middle of printing a long document or at 99% of a large download that doesn't handle resuming for example. It's just that these states should only be enabled for the duration of these actions and (usually) not for the entire app lifetime.

                      franco.amatoF Offline
                      franco.amatoF Offline
                      franco.amato
                      wrote on last edited by
                      #11

                      @Chris-Kawa said in How to prevent Windows from entering in hibernate/sleep mode:

                      You don't usually need a timer for this. ES_CONTINUOUS means "I need the state of the specified flags preserved until I clear them".

                      In my case (without a timer) it's not working

                      That being said take care which flags you actually specify. If you need the display running use ES_DISPLAY_REQUIRED, but combining it with ES_AWAYMODE_REQUIRED doesn't make much sense.

                      So what should I use? I need to capture a frame every second and perform some operations

                      And yes, do check return values of your system calls!

                      What should I do in case of failure?

                      1 Reply Last reply
                      0
                      • Chris KawaC Offline
                        Chris KawaC Offline
                        Chris Kawa
                        Lifetime Qt Champion
                        wrote on last edited by Chris Kawa
                        #12

                        So what should I use? I need to capture a frame every second and perform some operations

                        If you need the system to stay awake it should be enough to call this once:
                        SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)
                        Alternatively you can start a timer and call this periodically:
                        SetThreadExecutionState(ES_SYSTEM_REQUIRED)
                        If you also need the display to stay on add ES_DISPLAY_REQUIRED to any of those.

                        What should I do in case of failure?

                        I don't know. It's your app. You could inform the user, close the app, do nothing or anything else you feel like. Up to you.

                        1 Reply Last reply
                        2
                        • franco.amatoF franco.amato has marked this topic as solved on

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved