Если я вызываю QMetaObject :: invokeMethod из потока в синглетон, является ли вызов все еще в этом qthread? - PullRequest
0 голосов
/ 31 января 2012

у меня есть поток (работает отлично), который вызывает метод в объекте синглетного типа, как это:

bool bInvokeUpdate= QMetaObject::invokeMethod(ApiManager::getInstance(),
         "updateMainWindowTree",
         Qt::BlockingQueuedConnection,
         Q_RETURN_ARG(bool, bReturnUpdate))

;

я использую Qt :: BlockingQueuedConnection, поэтому я могу продолжить работу потока на основезначение bool .. в любом случае, мой вопрос - доза, эта вызов остается в теме?или это приводит к тому, что метод должен быть предварительно сформирован в основном потоке?

, когда я отлаживаю приложение, когда я в потоке, я вижу в отладчике, что я в потоке с идентификатором xxxx, но когда я устанавливаю точку останова в методе updateMainWindowTree,Я вижу, как он прыгает в основную тему.так что это значит, что я продолжаю вызывать функции из основного потока?как я могу избежать этого?

1 Ответ

1 голос
/ 31 января 2012

Поскольку вы использовали Qt::BlockingQueuedConnection, вызов выполняется в потоке, к которому принадлежит QObject ApiManager::getInstance().

Если бы этот синглтон принадлежал тому же потоку, что и вызывающий код, вы бы зашли в тупик.

Вы можете использовать Qt::DirectConnection, чтобы остаться в том же потоке, но название вашей функции предполагает, что это связано с GUI, поэтому его следует выполнять в главном потоке (т.е. ваш текущий код и его поведение наверное уже оба правильно).

...