On Apr 22, 5:34 pm, Lie Ryan <lie.1...@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.) Carl Banks -- http://mail.python.org/mailman/listinfo/python-list