QObject :: moveToThread и выполнение функции-члена внутри этого потока - PullRequest
4 голосов
/ 26 января 2012

Если объект типа QObject перемещается в поток с QObject::moveToThread, все сигналы, которые получает объект, обрабатываются внутри этого потока. Однако, если слот вызывается напрямую (object->theSlot()), этот вызов все равно будет заблокирован. Каков будет нормальный способ выполнить этот вызов внутри потока и немедленно вернуть управление вызывающему потоку? Хаки с QTimer не в счет. Установка единственного целевого соединения и его повторное удаление может считаться решением, если ничего не помогло.

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Вы можете использовать QMetaObject::invokeMethod, когда Qt :: ConnectionType имеет значение Qt :: QueuedConnection

0 голосов
/ 26 января 2012

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...