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

In reply to Re: PerlTk on a thread... by zentara
in thread PerlTk on a thread... by Wiggins

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.