简体   繁体   中英

time.sleep does not work for multithreaded

I was trying to multithread the code for "Suspend / Hibernate pc with python" provided by Ronan Paixão when I find that time.sleep() does not suspend the thread that run pywin32 module.

>>> Warning! The following code will put Windows to sleep <<<

def suspend(buffer, hibernate=False):
    '''Puts Windows to Suspend/Sleep/Standby or Hibernate.

    Parameters
    ----------
    buffer: string, for time.sleep()
    hibernate: bool, default False
        If False (default), system will enter Suspend/Sleep/Standby state.
        If True, system will Hibernate, but only if Hibernate is enabled in the
        system settings. If it's not, system will Sleep.

    Example:
    --------
    >>> suspend()
    '''
    print('before sleep') 
    sleep(float(buffer))
    print('after sleep')
    # Enable the SeShutdown privilege (which must be present in your
    # token in the first place)
    priv_flags = (win32security.TOKEN_ADJUST_PRIVILEGES |
                  win32security.TOKEN_QUERY)
    hToken = win32security.OpenProcessToken(
        win32api.GetCurrentProcess(),
        priv_flags
    )
    priv_id = win32security.LookupPrivilegeValue(
        None,
        win32security.SE_SHUTDOWN_NAME
    )
    old_privs = win32security.AdjustTokenPrivileges(
        hToken,
        0,
        [(priv_id, win32security.SE_PRIVILEGE_ENABLED)]
    )

    if (win32api.GetPwrCapabilities()['HiberFilePresent'] == False and
            hibernate == True):
        import warnings
        warnings.warn("Hibernate isn't available. Suspending.")
    try:
        windll.powrprof.SetSuspendState(not hibernate, True, False)
    except:
        # True=> Standby; False=> Hibernate
        # https://msdn.microsoft.com/pt-br/library/windows/desktop/aa373206(v=vs.85).aspx
        # says the second parameter has no effect.
        #        ctypes.windll.kernel32.SetSystemPowerState(not hibernate, True)
        win32api.SetSystemPowerState(not hibernate, True)

    # Restore previous privileges
    win32security.AdjustTokenPrivileges(
        hToken,
        0,
        old_privs
    )


if __name__ == '__main__':
    Thread(target=suspend, args=("10")).start()

The print function did waited for time.sleep() , but the Windows was immediately put to sleep. What happened?

You're passing the buffer argument in the call to Thread incorrectly, so it's only sleep ing for 1.0 second. You need to add a comma , at the end of value for the args keyword argument like this:

.
.
if __name__ == '__main__':
    Thread(target=suspend, args=("10",)).start()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM