Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Perl/Tk and Threads

by Streen (Sexton)
on Jun 17, 2004 at 12:22 UTC ( [id://367593]=perlquestion: print w/replies, xml ) Need Help??

Streen has asked for the wisdom of the Perl Monks concerning the following question:

I have a problem regarding Perl/Tk and Threads,
I made a GUI with TK and from this GUI I am calling a module which has a long runtime. Now I would like to display some status messages about this module, how far it reached.
I tried to make this with Threads, but this won't function.
sub run { #this is called via a button from the GUI #Call the Module $threadRun = Thread -> new (\&printExcel::Edit, $option,$path); #print the status &printStatus(); } sub printStatus { print "\n\n\n\n\n\nprint status\n"; #hier hol ich mir den neuen status my @NewStatus = &printExcel::GetStatus(); print "new status: @NewStatus\n"; #now wait 5 seconds an call yourself $Basic_wd -> after (5000, &printStatus(@NewStatus)); }
I know the "printStatus" sub is an endless loop, but this is not the problem. The problem is, when i call the thread, the sub defined in the thread is called, the "printStatus" sub is also called, but only once.
The sub "&printExcel::Edit" runns and when it finished, the whole Gui freezes and the progam is hooked. Has anyone some suggetstions what i made wrong or how I could solve this problem?

Replies are listed 'Best First'.
Re: Perl/Tk and Threads
by gri6507 (Deacon) on Jun 17, 2004 at 13:24 UTC
    One way to do it would be to fork off another process which would communicate to the parent through a socket and have the parent test the socket with select() in a repeat() event. Take a look at the code (untested snipets of an older app).

Re: Perl/Tk and Threads
by zentara (Archbishop) on Jun 17, 2004 at 14:37 UTC
    The first thought that comes to me is to use a repeat statement instead of your "after". Sometimes you just have to use "trial and error" and try alot of different approaches.
    my $id; #setup a global for the repeat so you can cancel #from anywhere in the script sub run { #this is called via a button from the GUI #Call the Module # update: also try to start the repeat here, before the # thread start $threadRun = Thread -> new (\&printExcel::Edit, $option,$path); #print the status $id = repeat(5000, \&printStatus() ); } sub printStatus { print "\n\n\n\n\n\nprint status\n"; #hier hol ich mir den neuen status my @NewStatus = &printExcel::GetStatus(); print "new status: @NewStatus\n"; }

    I'm not really a human, but I play one on earth. flash japh

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://367593]
Approved by gri6507
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (6)
As of 2024-04-23 07:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found