my @long_list_of_items; # do not call this directly sub main_process { if (@long_list_of_items) { process_item(shift @long_list_of_items); $button->after(50,\&main_process); } } # call this to add items to the list sub add_item { my $schedule = !@long_list_of_items; push @long_list_of_items,@_; if ($schedule) { $button->after(50,\&main_process); } }