confusing thread behavior

paul phartley at gmail.com
Thu Dec 3 17:29:43 EST 2009


On Dec 3, 2:03 pm, Mike Driscoll <kyoso... at gmail.com> wrote:
> On Dec 3, 3:42 pm, paul <phart... at gmail.com> wrote:
>
>
>
>
>
> > I have been experiencing strange thread behavior when I pass a message
> > received via a Queue to a wx.PostEvent method (from wxPython). The
> > relevant code in the thread is:
>
> > def run(self):
> >     while self.is_running:
> >         task = self.queue.get()
> >         wx.PostEvent(self.app.handle_task, task)
>
> > self.queue is a Queue.Queue instance and self.app is a wx.Window
> > instance
>
> > I have a case where two items are placed in the queue one after the
> > other, and it appears that only the first item is passed to
> > wx.PostEvent.  If I place a time.sleep(0.1) call anywhere within the
> > while loop, both items get passed to wx.PostEvent.  It works if I put
> > time.sleep before the self.queue.get(), in between get() and PostEvent
> > () or after PostEvent().  So it seems like a short delay is enough to
> > get two items handled, although it doesn't seem to matter where I
> > place the delay within the while loop.  Does someone know what might
> > explain this behavior?  Thanks.
>
> [Note: I cross-posted this to wxPython where Paul had also cross-
> posted]
>
> Not sure if this will help or not, but see the following article on
> the wxPython wiki:
>
> http://wiki.wxpython.org/LongRunningTasks
>
> There's a section called "More Tips" where Queues are discussed. Robin
> Dunn (creator of wxPython) seems to recommend using wx.CallAfter there
> rather than PostEvent.
>
> -------------------
> Mike Driscoll
>
> Blog:  http://blog.pythonlibrary.org


I apologize -- I meant to type wx.CallAfter instead of wx.PostEvent in
my posting here (I've actually tried both approaches and did not see
any difference...).  I've looked over the LongRunningTasks wiki.  I'll
look at it again!



More information about the Python-list mailing list