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