On Feb 22, 10:20 am, mark <[EMAIL PROTECTED]> wrote: > On 21 Feb 2007 14:47:50 -0800, placid <[EMAIL PROTECTED]> wrote: > > > > > On Feb 22, 3:23 am, mark <[EMAIL PROTECTED]> wrote: > > > On 20 Feb 2007 21:26:18 -0800, placid <[EMAIL PROTECTED]> wrote: > > > > > On Feb 21, 4:21 pm, "placid" <[EMAIL PROTECTED]> wrote: > > > > > On Feb 21, 4:12 pm, mark <[EMAIL PROTECTED]> wrote: > > > > > > On 20 Feb 2007 20:47:57 -0800, placid <[EMAIL PROTECTED]> wrote: > > > > > > > On Feb 21, 3:08 pm, mark <[EMAIL PROTECTED]> wrote: > > > > > > > > Right now I have a thread that sleeps for sometime and check > > > > > > > > if an > > > > > > > > event has happened and go back to sleep. Now instead I want the > > > > > > > > thread > > > > > > > > to sleep until the event has occured process the event and go > > > > > > > > back to sleep > > > > > > > > > class eventhndler(threading.Thread): > > > > > > > > def __init__(self): > > > > > > > > threading.Thread.__init__(self) > > > > > > > > def run(self): > > > > > > > > while True: > > > > > > > > time.sleep(SLEEPTIME) > > > > > > > > ''''do event stuff''' > > > > > > > > The way i would do this is by using an threading.Event ( > > > > > > >http://docs.python.org/lib/event-objects.html) > > > > > > > > <code> > > > > > > > > class eventhandler(threading.Thread): > > > > > > > def __init__(self): > > > > > > > threading.Thread.__init__(self) > > > > > > > self.event = threading.Event() > > > > > > > def run: > > > > > > > while True: > > > > > > > # block until some event happens > > > > > > > self.event.wait() > > > > > > > """ do stuff here """ > > > > > > > self.event.clear() > > > > > > > </code> > > > > > > > > the way to use this is to get the main/separate thread to set() > > > > > > > the > > > > > > > event object. > > > > > > > Can you give an example of how to get the main threead to set teh > > > > > > event object? > > > > > > this is exactly what i wanted to do! > > > > > > thanks a lot! > > > > > > mark> > > > > oops I've miss-typed the thread variable name the following should > > > > work > > > > > <code> > > > > if __name__ == "__main__": > > > > evtHandlerThread = eventhandler() > > > > evtHandlerThread.start() > > > > > # do something here # > > > > evtHandlerThread.event.set() > > > > > # do more stuff here # > > > > evtHandlerThread.event.set() > > > > > </code> > > > > Can I have the same thread process two or more events? Can you tell > > > how to do this? The code you gave is waiting on one event right. How > > > can I do it for more events? > > > thanks a lot! > > > mark > > > I don't think a thread can block on more than one event at a time. But > > you can make it block on more then one event one at a time. > > > <code> > > > class eventhandler(threading.Thread): > > def __init__(self): > > threading.Thread.__init__(self) > > self.events = [threading.Event(), threading.Event()] > > self.currentEvent = None > > def run: > > while True: > > for event in self.events: > > self.currentEvent = event > > # block until some event happens > > self.currentEvent.wait() > > """ do stuff here """ > > self.currentEvent.clear() > > > if __name__ == "__main__": > > evtHandlerThread = eventhandler() > > evtHandlerThread.start() > > > # do something here # > > evtHandlerThread.currentEvent.set() > > > # do more stuff here # > > evtHandlerThread.currentEvent.set() > > > </code> > > > what the thread does is sequentially waits for two events to happen > > and then execute the same code. You could change this code to perform > > different functions for different event objects. > > Once the thread starts it is going to wait on the event that is the > first element of the list right? This would mean :
This is correct. > evtHandlerThread.currentEvent.set(): that I have only one event right? this means that the current event occurred. > Can you explain how I can have different event objects. I dont see how > I can do different functinos for same event. > > Thanks a lot! > > mark To run different functions for the same event is easy, just write a wrapper class around threading.event() and include some method that you will run and assign this to different functions for each EventWrapper. <code> class EventWrapper(): def __init__(self,work ): self.event = threading.Event() self.eventWork = work def wait(self): self.event.wait() def clear(self) self.event.clear() def eventWork(self): print "no work" class eventhandler(threading.Thread): def __init__(self, events = None): threading.Thread.__init__(self) self.events = events self.currentEvent = None def run: while True: if self.events: for event in self.events: self.currentEvent = event # block until the current event happens self.currentEvent.wait() self.currentEvent.eventWork() self.currentEvent.clear() def eventOneWork(): # do some event 1 specific work here def eventTwoWork(): # do some event 2 specific work here if __name__ == "__main__": events = [EventWrapper(eventOneWork),EventWrapper(eventTwoWork)] evtHandlerThread = eventhandler(events) evtHandlerThread.start() # do something here # evtHandlerThread.currentEvent.set() # do more stuff here # evtHandlerThread.currentEvent.set() </code> So you have a EventWrapper class that now contains the Event object and a workEvent() method which is assigned to a function you create. Hope this helps. Cheers -- http://mail.python.org/mailman/listinfo/python-list