use Time::HiRes qw(time); my $progress; my $popup = Tk->after( 2, sub { $progress = create_progress_dialog } ); my $last_poll = time(); while (<$input_file>) { # let Tk process its events every 0.1 seconds: if (time - $last_poll > 0.1) { Tk->process_one_event(); }; ... }; if ($progress) { undef $progress; }; undef $popup; # cancel our Tk->after() timeout