Как было предложено в этом вопросе, сейчас я пытаюсь включить многопоточность.
Согласно ссылкам, предоставленным karlphillip, я понимаю, что документация о подклассах QThread не должна соблюдаться и использовать moveToThread()
как объяснил. Теперь я вижу, что реализация QThread run()
по умолчанию имеет только exec()
, который затем должен быть завершен вызовом quit()
, когда рабочий поток завершит операции. Теперь у меня есть несколько вопросов, чтобы я лучше понял:
QApplication* ptrApp=new QApplication(argc,argv);
QThread* th=new QThread;
MyClass* obj=new MyClass;
obj->moveToThread(th);
QObject::connect(th,SIGNAL(started()),obj,SLOT(someFunct()));
QObject::connect(obj,SIGNAL(over()),th,SLOT(quit()));
th->start();
//some GUI code in main thread here
return ptrApp->exec();
Что произойдет, если я продолжу использовать
someFunct()
даже после того, как испущуover()
изsomeFunct()
? Это неопределенное поведение или нормальное?С каким потоком теперь будет связан
obj
(в то время как остальная часть кода после выдачиover()
все еще выполняется вsomeFunct
)? Насколько я понимаю, это не может быть вth
, когда у меня естьquit()
этот поток...quit()
будет поставлен в очередь до тех пор, покаexec()
в основном потоке не выполнит его, что приведет к выходуexec()
вrun()
изth
(надеюсь, я не делаю здесь ошибка). Я предполагаю, что ветка больше не существует.Как только слот
quit()
дляth
выполнен, можно ли предположить, что поток действительно завершился, или мне следует дополнительно подключить сигналfinished()
th
к некоторому слоту, чтобы быть абсолютно уверенным?