in reply to Two questions on interprocess communication
As far as running LWP and being able to cancel it, it probably is best to run the following "callback enhanced" LWP, so you can stop it at any time. In order to avoid blocking the Tk loop, run the sub in a separate thread, and use a shared variable to cancel it's running at a clever spot.
sub get_a_file { # don't buffer the prints to make the status update $| = 1; #from lwpcook use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $URL = 'http://zentara.net/zentara1.avi'; my $filename = substr( $URL, rindex( $URL, "/" ) + 1 ); #print "$filename\n"; open( IN, ">$filename" ) or die $!; my $expected_length; my $bytes_received = 0; my $res = $ua->request( HTTP::Request->new( GET => $URL ), sub { my ( $chunk, $res ) = @_; $bytes_received += length($chunk); unless ( defined $expected_length ) { $expected_length = $res->content_length || 0; } if ($expected_length) { $progress = 100 * $bytes_received / $expected_length; printf "%d%% - ", 100 * $bytes_received / $expected_le +ngth; } print "$bytes_received bytes received\n"; # XXX Should really do something with the chunk itself print IN $chunk; } ); print $res->status_line, "\n"; close IN; }
|
|---|