On Wednesday, December 12, 2012 3:53:28 PM UTC-5, MRAB wrote:
> On 2012-12-12 20:11, Wanderer wrote:
> 
> > I have a program that has a main GUI and a camera. In the main GUI, you can 
> > manipulate the images taken by the camera. You can also use the menu to 
> > check the camera's settings. Images are taken by the camera in a separate 
> > thread, so the long exposures don't block the GUI. I block conflicts 
> > between the camera snapshot thread and the main thread by setting a flag 
> > called self.cameraActive. I check to see if the cameraActive flag is false 
> > and set the cameraActive to True just before starting the thread. I 
> > generate an event on exiting the thread which sets the cameraActive flag to 
> > False. I also check and set and reset the flag in all the menu commands 
> > that access the camera. Like this.
> 
> >
> 
> >      def onProperties(self, event):
> 
> >          """ Display a message window with the camera properties
> 
> >          event -- The camera properties menu event
> 
> >          """
> 
> >          # Update the temperature
> 
> >          if not self.cameraActive:
> 
> >              self.cameraActive = True
> 
> >              self.camera.getTemperature()
> 
> >              camDict = self.camera.getPropertyDict()
> 
> >              self.cameraActive = False
> 
> >          else:
> 
> >              camDict = {'Error': 'Camera Busy'}
> 
> >          dictMessage(camDict, 'Camera Properties')
> 
> >
> 
> > This works but my question is, is there a better way using semaphores, 
> > locks or something else to prevent collisions between threads?
> 
> >
> 
> That suffers from a race condition in that self.cameraActive might be
> 
> False when it's checked in the 'if' condition but set to True just
> 
> afterwards by the other thread.
> 
> 
> 
> You could try a non-blocking semaphore:
> 
> 
> 
> def __init__(self):
> 
>      self.cameraActive = Semaphore()
> 
> 
> 
> def onProperties(self, event):
> 
>      """ Display a message window with the camera properties
> 
>      event -- The camera properties menu event
> 
>      """
> 
>      # Update the temperature
> 
>      if self.cameraActive.acquire(False): # Non-blocking
> 
>          # Successfully acquired the semaphore, so the camera wasn't active
> 
>          self.camera.getTemperature()
> 
>          camDict = self.camera.getPropertyDict()
> 
>          self.cameraActive.release()
> 
>      else:
> 
>          camDict = {'Error': 'Camera Busy'}

Thanks. Why Non-blocking?
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to