in reply to TK GUI frozen windows

You really need to provide an example, so we can see how the long process is called, and blocking the Tk gui. If you are calling a code block, which can be sprinkled with $mw->update, that may be an easy way out; but generally you want to spawn off your long process into a separate thread on Windows, and read back the output to the main program thru shared variables or a shared filehandle.

See Please suggest a non-forking way to do this (OS: windows) and Perl/Tk App and Interprocess Communication and How does system(1,"foo") work on Windows? for similar discussions. Here is a simple example where you can try to put your long process into it's own thread.

#!/usr/bin/perl use warnings; use strict; use threads; use threads::shared; use Tk; my %shash; #share(%shash); #will work only for first level keys my %hash; share ($shash{'go'}); share ($shash{'fileno'}); share ($shash{'pid'}); share ($shash{'die'}); $shash{'go'} = 0; $shash{'fileno'} = -1; $shash{'pid'} = -1; $shash{'die'} = 0; $hash{'thread'} = threads->new(\&work); my $mw = MainWindow->new(-background => 'gray50'); my $text = $mw->Scrolled('Text')->pack(); my $startb = $mw->Button( -text => 'Start', -command=>sub{ $shash{'go'} = 1; $mw->after(100); #give pipe chance to startup my $fileno = $shash{'fileno'}; print "fileno_m $fileno\n"; open (my $fh, "<&=$fileno") or warn "$!\n"; # filevent works but may not work on win32, # but you can use a timer instead as shown below $mw->fileevent(\*$fh, 'readable', ); while(<$fh>){ $text->insert('end',$_); $text->see('end'); $mw->update; } # on Win32 (untested by me) you may need # a timer instead of fileevent # my $repeater; # $repeater = $mw->repeat(10, # sub { # my $bytes = sysread( "<&=$fileno", my $buf, 8192); # $text->insert('end',$buf); # $text->see('end'); # if( $shash{'go'} == 0 ){ $repeater->cancel } # } # ); } )->pack(); my $stopb = $mw->Button( -text => 'Stop/Exit', -command=>sub{ $shash{'die'} = 1; kill 9,$shash{'pid'}; $hash{'thread'}->join; exit; }, )->pack(); MainLoop; ################################################################## sub work{ $|++; while(1){ if($shash{'die'} == 1){ return }; if ( $shash{'go'} == 1 ){ #run your command here, and try to find a way to capture it's +output # into a filehandle, then use fileevent or a timer in the main + Tk program # to read the filehandle # on win32 you may need to use IPC::Run in the thread #use a win32 command that gives continous output # on linux I use top my $pid = open(FH, "top -b |" ) or warn "$!\n"; #on win32 you can use system(1, $command) IIRC # see link above my $fileno = fileno(FH); print "fileno_t->$fileno\n"; $shash{'fileno'} = $fileno; $shash{'pid'} = $pid; $shash{'go'} = 0; #turn off self before returning }else { select(undef,undef,undef,.1) } #short sleep } }

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku