WINXP vs. LINUX in threading.Thread
pavlovevidence at gmail.com
Thu Apr 23 06:16:43 CEST 2009
On Apr 22, 5:34 pm, Lie Ryan <lie.1... at gmail.com> wrote:
> Diez B. Roggisch wrote:
> > Kent schrieb:
> >> hello all,
> >> i want to add a "new update notification" feature to my wxPython appl.
> >> The codes below do the job. The logic is simple enough, I don't think
> >> it needs to be explained.
> >> since sometimes, under windows, proxy setting was a script. and was
> >> set in IE. In this case, connecting to the HTML will take relative
> >> long time. I therefore run the following codes in a new Thread
> >> (subclass of threading.Thread), so that user don't have to wait during
> >> the version checking period.
> >> Under Linux, it worked smoothly. But under Windows XP, it didn't. If
> >> there was new updates, the notification dialog can show, but no text,
> >> icon, .... on it. Then, the whole application didn't response any
> >> longer. :( I have to force stop the application process.
> >> where is the problem?
> > GUI-toolkits and threads usually are not a good idea (Qt4 being an
> > exception to that rule, at least they claim that). Google wxPython +
> > threading for answers how to solve this - essentially, you need to
> > create a timer or event-based solution that allows your
> > background-thread to inject a status message to the main eventloop.
> > Diez
> You should use the GUI toolkit's own event loop for threading. An event
> loop is some sort of cooperative multithreading mechanism,
The function in question, gethostbyname, isn't cooperating, though.
It blocks for a substantial amount of time from an event handler,
freezing the application.
> if you used
> the threading mechanism from the threading library, there will be two
> conflicting threading mechanism, resulting in many hard-to-predict
> situation if you're not careful. The wxYield mechanism is much easier
> option than multithreading.
The problem is, during most of the delay wxYield can't be called
becaust the function gethostbyname is blocking.
I think Diez is correct. To avoid the freeze, one should spawn a
thread, and when it completes it should notify the GUI thread by
pushing an event or scheduling an idle call. Functions that do that
are usually thread-safe. (A permanent worker thread might be better
but it would involve a lot more synchronization.)
More information about the Python-list