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'}

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to