Использование отдельного потока - это современный способ сделать это, но есть и другой подход.
Вы можете взять все из цикла while и поместить их в обработчик событий.Сделайте так, чтобы цикл обработки сообщений вызывал этот обработчик событий снова и снова, пока работа не будет выполнена (например, с использованием таймера или обработки в режиме ожидания).В то же время вы можете отобразить немодальное всплывающее диалоговое окно.Так работала печать в эпоху упреждающей многозадачности.См. SetAbortProc .
Я бы порекомендовал подход второго потока, указанный другими.Я просто хотел отметить, что это не единственный способ.