Вы можете использовать QFuture<T> QtConcurrent::run ( Function function, ... )
, чтобы запустить выполнение внутри отдельного потока, а затем использовать QFutureWatcher
, чтобы получить результат.Вам не нужно будет вызывать movetoThread
.
В основном что-то вроде:
QFutureWatcher<T>* watch = new QFuture(0);
connect(watch, SIGNAL(finished()), this, SLOT(handleResult()));
QFuture<T> future = QtConcurrent::run( myObj, &QMyObject::theSlot(), args...);
watch.setFuture(future);
....
//slot
private void handleResult(){
if(future->isCancelled())
return;
T mydata = watch->future()->result();
// use your data as you want
}
QtConcurrent::run
запланирует запуск метода этого объекта в некотором потоке.Это не блокирует.С другой стороны, QFuture::result()
блокируется до тех пор, пока не будет получен результат, если вычисления все еще продолжаются.Вот почему вам нужен другой объект, чтобы уведомить о завершении вычислений, используя finished()
.Я не могу придумать лучший дизайн для вашей проблемы в Qt.