QCoreApplication::quit ()
не указан как потокобезопасный метод, поэтому его нельзя вызвать из другого потока.Ваше приложение может аварийно завершить работу или получить неопределенное поведение (UB).
t.wait()
никогда не вернется, потому что работающий поток постоянно ожидает событий.Чтобы остановить поток, вы должны позвонить QThread::quit () [slot]
Если вы хотите выйти из приложения после завершения работы, вы должны подать сигнал, который подключен к QCoreApplication::quit () [static slot]
Если выЕсли вы хотите остановить рабочий поток после выполнения работы, вы также должны подать сигнал, связанный с void QThread::quit () [slot]
Добавлено: Потоки, события и объекты QObjects для дальнейшего чтения
Важное замечание: Вы должны позвонить QCoreApplication::exec()
, чтобы иметь возможность использовать механизм сигнала и слота между потоками, соединениями в очереди.
Из Qt QThread doc:
Каждый QThread может иметь свой собственный цикл обработки событий.Вы можете запустить цикл обработки событий, вызвав exec ();Вы можете остановить это, вызвав exit () или quit ().Наличие цикла событий в потоке позволяет подключать сигналы от других потоков к слотам в этом потоке, используя механизм, называемый соединения в очереди .Это также позволяет использовать в потоке классы, для которых требуется цикл обработки событий, например QTimer и QTcpSocket.Однако обратите внимание, что невозможно использовать какие-либо классы виджетов в потоке.
Doc для Qt :: QueuedConnection:
Слот вызывается, когда элемент управления возвращаетсяк циклу событий потока получателя.Слот выполнен в потоке получателя.