my $start_time = time(); # remember when we started my $progress; while (<$input_file>) { ... if (time - $start_time > 2) { # 2 seconds have passed $progress = create_progress_dialog(); Tk->update(); # I don't know if there is such a thing or whether Tk needs it }; }; undef $progress; # hide progress dialog if we have one #### 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