python response slow when running external DLL

jfong at ms4.hinet.net jfong at ms4.hinet.net
Sat Nov 28 02:37:58 EST 2015


Peter Otten at 2015/11/27 UTC+8 8:20:54PM wrote:

> Quick-fix example:
> def download():
>     var.set("Starting download...")
>     root.update_idletasks()
>     time.sleep(3)
>     var.set("... done")

Thanks, Peter, The update_idletasks() works. In my trivial program it's easy to apply for there are only two places call the DLL function.

> A cleaner solution can indeed involve threads; you might adapt the approach 
> from <http://effbot.org/zone/tkinter-threads.htm> (Python 2 code).

Using thread is obviously more logical. I think my mistake was the "while busy:  pass" loop which makes no sense because it blocks the main thread, just as the time.sleep() does. That's why in your link (and Laura's too) the widget.after() scheduling was used for this purpose.

>From what I had learned here, the other way I can do is making the codes modified as follows. It will get ride of the "result" and "busy" global variables, but it also makes the codes looks a little ugly. I think I will take the update_idletasks() way in this porting for it seems more simpler, and can be used on thread or non-thread calling. Thank you again.
    .....
    .....
    #do the rest
    var_status.set('Download...')
    _thread.start_new_thread(td_download, ())  #must use threading

def td_download():
    result = mydll.SayHello()
    if result:
        var_status.set("Download Fail at %s" % hex(result))
        showerror('Romter', 'Download Fail')
    else:
        var_status.set('Download OK')            
        showinfo('Romter', 'Download OK')




More information about the Python-list mailing list