В Qt есть абстракция над потоками
QtConcurrent. В ней есть метод
run. Куда можно забросить метод, который вы хотите выполнить асинхронно. run вернет вам
QtFuture. Через него мы можем узнать, что сейчас происходит с нашим потоком(завершился или еще работает). QtFuture можно передать в
QtFutureWatcher в котрого есть сигнал
finished, который стрельнет когда функция завершить свою работу.
Преимуществом данного подхода является, то что Qt берет на себя всю волокиту с созданием и управлением потоков.