По-хорошему, тяжелую логику (а вызовы sleep можно назвать тяжелой задачей, т.к. это тормозит поток, который не сможет обрабатывать события интерфейса) нужно выносить в отдельный поток (thread), GUI-поток должен вести себя пассивно и заниматься лишь взаимодействием с пользователем и запусками background worker'ов (для длительных операций).
В вашем случае есть простой путь: разделить задачки на итерации и выполнять их по таймеру.
Либо организовать полноценный фоновый поток, который можно будет невозбранно тормозить через
sleep
.
Если английский средней школы позволяет, советую пройти вот этот
туториал.