Использование флагов - очевидный и самый распространенный способ добиться цели, но если вы работаете на платформе linux / unix, я бы посоветовал вам использовать каналы. У меня была та же проблема, когда я использовал флаг (это делает код не защищенным от потоков, и ошибки, возникающие из-за такого флага, трудно отследить), затем я изменил реализацию, чтобы использовать каналы, которые были эффективным способом сделать все необходимое.
Если хотите, для платформы linux я могу показать вам, как использовать каналы для завершения QThread.
У вас также может быть Windows-эквивалент труб, о котором я мало что знаю, так как я мало занимался программированием на платформе Windows.
Надеюсь, это поможет