ciscorucin...@gmail.com writes: > Hello, > > I have been using Python for a few months now, so I am still learning a few > things here and there. > > Basically I am creating a program that will stream musical notes into a > program called Lilypond one-by-one and it will create the sheet music for > that stream of music via OS command. Your understanding of Lilypond is not > needed, but you need to know that for each new note that is streamed in > "real-time", a PNG image file will be created for that stream of music up to > that point...via Lilypond. > > What I am looking at doing is to monitor the directory where the image files > are being created in real-time, and update the GUI (build with gtk.Builder > and Glade) with the most recent image file. I have the program multithreaded > and it appears that all of the images are being created sequentially; > however, I need to make sure that an older image (an image with less notes > displayed) is NOT going to be displayed over a newer image. > > The question I have is what do you see as the best way of going about this? > > I have looked at creating a Stack from the python List, along with os.walk(). > However, I am not sure if those are adequate with a directory that is > actively adding new files. Also, how I imagined using the Stack with taking > the next item off of the stack meant that older ones would be replacing new > ones...and with a queue, it might be updating too slow; especially if the > notes being streamed in are played fast. So I would like for the most recent > image to be used and all others discarded. > I suppose you have two threads, one for producing the music by calling Lilypond, and one for displaying the generated images. Because it is multithreaded you should use a Queue from the module Queue(Python2)/queue(Python3) to communicate between the threads.
Producing thread: send note to Lilypond wait until PNG file is generated (Lilypond completed) Q.put(filename) Displaying thread: while True: fn = Q.get() # this will block until a filename is available # now check if there is more in the queue while True: try: fn = Q.get_nowait # here we got a newer one except Empty: break # stop the inner loop display the image in fn. In this way you always display the most recent one. You can make it more sophisticated by removing files that have been displayed and files that you skip. -- Piet van Oostrum <p...@vanoostrum.org> WWW: http://pietvanoostrum.com/ PGP key: [8DAE142BE17999C4] -- http://mail.python.org/mailman/listinfo/python-list