У вас такой длинный цикл. что надо кнопкой останавливать -- переделывайте. Такого в приложении быть не должно.
Длительные операции нужно делать кусочками и асинхронно.
Сформируйте очередь задач. Каждая задача должна быть мелкой и атомарной.
У вас тут, судя по всему, сплошная архитектурная лапша в коде.
Не ясно как вы этот код запускаете, не ясно что у вас вокруг него.
Ясно только, что вы тут намудрили какой-то витиеватый костыль и пытаетесь решить стандартную задачу каким-то кустарным дендрофекальным методом.
Из всего могу срезюмировать.
- Выделите и изолируйте модель задачи.
- Накапливайте их в очереди.
- Заполняйте очередь когда это требуется. Вытаскивайте и обрабатывайте отдельные задачи когда это возможно, но асинхронно.
Более подробно можно подумать, если объясните чего пытаетесь тут добиться.
Если попробовать играть по вашим правилам и дать ответ на именно ваш не очень правильный вопрос, то нужно обрабатывать интерфейс в отдельном треде, между тредами поднять мьютекс и по его состояние проверять в этом цикле. Но это плохой путь.