in reply to PerlTk on a thread...

Hi, you will run into glitches unless you let Tk be the main thread. There are some rules to follow to use Tk with threads safely.

1. Keep Tk only in the main thread. So make Tk just display shared variables, collected from the worker threads.

2. Create the worker threads before any Tk statements are used.

3. Do not try to access Tk widgets from worker threads. Pass shared variables instead. Tk -textvariable options will not be seen across threads. You need a timer to read them.

4. If a thread is long running, and you need to kill it, you need to send it to the end of it's code block before joining it, or a harmless error is issued about "threads exiting while others are running".

5. You can share filehandles thru threads, by passing the fileno, see Re^3: Passing globs between threads, this is very handy. It means you can print to a filehandle in a thread, and read it in main, or vice-versa, using fileevent.

Here is some code to show the basics.

#!/usr/bin/perl use warnings; use strict; use threads; use threads::shared; # for shared vars ..... # declare, share then assign value my $ret; share $ret; $ret = 0; my $val = 0; #create thread before any tk code is called my $thr = threads->create( \&worker ); gui(); # tk code only in main sub gui { use Tk; my $mw = MainWindow->new(); $mw->resizable( 0, 0 ); my $label = $mw->Label( -width => 50, -textvariable => \$val )->pack(); my $timer; $mw->repeat(10,sub{ $val = $ret; }); MainLoop; } # no Tk code in thread sub worker { for(1..10){ print "$_\n"; $ret = $_; sleep 1; } $ret = 'thread done, ready to join'; print "$ret\n"; }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum