[python-win32] NTService detecting if the Windows System is Idle

Hughes, Chad O chad.hughes at pnl.gov
Fri Jun 10 22:32:43 CEST 2005


I think this example is what you want to do. It is not a service, but
you can turn it into one.

import win32pdh
from time import sleep
import threading

pdhQuery = win32pdh.OpenQuery(None, 0)

class PDH_COUNTER_PATH_ELEMENTS(list):
  def __init__(self, l = None):
    if not l:
      l = ['127.0.0.1',None,None,None,-1,None]
    list.__init__(self,l)
    self.__machineName = self[0]
    self.__objectName = self[1]
    self.__instanceName = self[2]
    self.__parantInstance = self[3]
    self.__instanceIndex = self[4]
    self.__counterName = self[5]
  def __setMachineName(self,value):
    self.__machineName = value
    self[0] = value
  def __setObjectName(self,value):
    self.__objectName = value
    self[1] = value
  def __setInstanceName(self,value):
    self.__instanceName = value
    self[2] = value
  def __setParentInstance(self,value):
    self.__parentInstance = value
    self[3] = value
  def __setInstanceIndex(self,value):
    self.__instanceIndex = value
    self[4] = value
  def __setCounterName(self,value):
    self.__counterName = value
    self[5] = value
  def __getMachineName(self):
    return self.__machineName
  def __getObjectName(self):
    return self.__objectName
  def __getInstanceName(self):
    return self.__instanceName
  def __getParentInstance(self):
    return self.__parentInstance
  def __getInstanceIndex(self):
    return self.__instanceIndex
  def __getCounterName(self):
    return self.__counterName
  machineName = property(__getMachineName, __setMachineName)
  objectName = property(__getObjectName, __setObjectName)
  instanceName = property(__getInstanceName, __setInstanceName)
  instanceIndex = property(__getInstanceIndex, __setInstanceIndex)
  parentInstanceIndex = property(__getParentInstance,
__setParentInstance)
  counterName = property(__getCounterName, __setCounterName)
  def makeCopy(self):
    return PDH_COUNTER_PATH_ELEMENTS(self)
  def __repr__(self):
    return 'machineName = %s\nobjectName = %s\nInstanceName =
%s\nparentInstance = %s\ninstanceIndex = %s\ncounterName =
%s'%tuple(self) 

class WorkerThread(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self, target = self.__runLoop)
    self.__pauseEvent = threading.Event()
    #when wait is called after clear the thread will pause until set  
    self.__pauseEvent.clear()
    self.__stayAlive = True
  def stop(self):
    self.__stayAlive = False
    #loop until runLoop is exited
    while self.isAlive():
      self.__pauseEvent.set()
  def pause(self):
    self.__pauseEvent.clear()
  def resume(self):
    self.__pauseEvent.set()
  def __runLoop(self):
    while self.__stayAlive:
      self.__pauseEvent.wait()
      #do what ever you want to do while the CPU is idle
      #example print that cpu is idle
      print 'The CPU is idle'
      

#make paths
cpe = PDH_COUNTER_PATH_ELEMENTS((
  '127.0.0.1',
  "Processor",
  '_Total', 
  None,
  -1,
  "% Idle Time"
))
#you can replace _Total with a CPU id.
#For example: replace it with 0 for the first CPU
#Look up Perfmon for more details 

procPath = win32pdh.MakeCounterPath(cpe)
procCounter = win32pdh.AddCounter(pdhQuery, procPath, 0)

#For Windows to get a good statistic you must collect once first.
#That way Windows can form a delta on the CPU usage.
win32pdh.CollectQueryData(pdhQuery)
sleep(.1)

#Lets say that the CPU is idle if it has 60% or more idle time. 
threshold = 90

worker = WorkerThread()
worker.start()
while 1:
  #type CTRL-C to stop
  try:
    #Collect the percient idle time
    win32pdh.CollectQueryData(pdhQuery) 
    format = win32pdh.PDH_FMT_LONG | win32pdh.PDH_FMT_NOSCALE
    idleTime = win32pdh.GetFormattedCounterValue(procCounter, format)[1]
    print idleTime 
    if idleTime >= threshold:
      worker.resume()
    else:
      worker.pause()
    sleep(.1)
  except:
    print 'Stopping thread'
    worker.stop()
    worker.join()
    raise


 
Chad

-----Original Message-----
From: Animesh Bansriyar [mailto:animesh at neolinuxsolutions.com] 
Sent: Friday, June 10, 2005 12:19 PM
To: Hughes, Chad O
Subject: RE: [python-win32] NTService detecting if the Windows System is
Idle



Chad,

Thanks for the reply. What I mean here is something like say, "Google
Desktop Search". The Indexer for Google Desktop Search doesn't run until
the system is "IDLE". I am not too sure what the word IDLE means. 

On Fri, 2005-06-10 at 21:51, Hughes, Chad O wrote:
> Are you saying that you want to launch a program that waits until the 
> CPU's idle time is at a given threshold and once the threshold is met 
> the program does something until the threshold is no longer met after 
> wich your app waits for the threshold again?
> 

In my case the application uses both more memory and more CPU, hence if
the application runs throughout, the systems become slow to use. So as
you sugessted, we could have a threshold like say, the NTService runs
when the System utilizes less than 5% of the RAM and 5% of CPU. Could
you help in this regard. Does it make sense?

Thanks in Advance,
Animesh




More information about the Python-win32 mailing list