Hi, "fork and join" are sort of 2 contradictory terms. Join is commonly used with threads, which on Windows emulates a Perl fork. Forks don't join, they exit with a return code. You don't say if you are on Windows or a Linux based system. You also don't say what exactly your forked subroutines will be doing, how will they signal that they are done? If you are on Windows and running long subroutines in an asynchronous matter, you may want to use threads. Threads with Tk need very special care, but can be done. Here are a couple of options, unless you want to provide more specifics as to what you are doing.

Using Tk::ExecuteCommand, you can change the text of the ExecuteCommand module's default buttons to anything you want.

#!/usr/bin/perl -w use Tk; use Tk::ExecuteCommand; use Tk::widgets qw/LabEntry/; use strict; my $mw = MainWindow->new; my $ec = $mw->ExecuteCommand( -command => '', -entryWidth => 50, -height => 10, -label => '', -text => 'Execute', )->pack; $ec->configure(-command => 'date; sleep 10; date'); my $button = $mw->Button(-text =>'Do_it', -background =>'hotpink', -command => sub{ $ec->execute_command }, )->pack; MainLoop;

Or you may want to try a thread with a shared variable, you can pass strings to be eval'd in the thread $data_in. I just used numbers in the simple hack.

#!/usr/bin/perl use warnings; use strict; use threads; use threads::shared; # declare, share then assign my $data_in:shared = 0; my $data_ret:shared = '----'; my $button_control:shared = 0; my $go_control:shared = 0; my $die_control:shared = 0; #create thread before any tk code is called my $thr = threads->create( \&worker ); use Tk; my $mw = MainWindow->new(); my $val = '----'; my $label = $mw->Label( -width => 50, -textvariable => \$val )->pack(); my $button = $mw->Button( -text => 'Start', -command => \&start )->pack(); # you need a timer to read the shared var in thread my $timer = $mw->repeat(10 , sub{ $val = $data_ret; }); my $timer1 = $mw->repeat(10, sub{ if($button_control){ $button ->configure(-text=> " +Next"); $button_control = 0; } }); MainLoop; sub start{ $button ->configure(-text=> "----"); $go_control = 1; $data_in = int rand(20); # pass some new data in } # no Tk code in thread sub worker { my $count; while(1){ if($die_control){ print "thread finishing\n"; return} #wait for $go_control if($go_control){ if($die_control){ print "thread finishing\n"; return} print "incoming $data_in\n"; $count++; print $count,"\n"; if($count >= $data_in){ $go_control = 0; $data_ret = $count +; $button_control = 1;} $data_ret = $count; select(undef,undef,undef,.25); }else{ $count = 0; select(undef,undef,undef,.25); }# sleep until awakened } return; }

I'm not really a human, but I play one on earth. ..... an animated JAPH

In reply to Re: how to fork & join in tk? by zentara
in thread how to fork & join in tk? by redss

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.