2012-01-31 1 views
0

у меня есть нить (рабочий большой), что метод вызова в объекте singletone так:Если я вызываю QMetaObject :: invokeMethod из потока в singleletone, то invokation все еще находится в этом qthread?

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

;

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

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

+0

Что такое ApiManager и где он находится? –

+0

его глобальный объект, который дает API-функцию, не связанную с графическим интерфейсом или что-то подобное, но дозу, вызванную из потока GUI, также – user63898

ответ

1

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

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

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

+0

, что лучше обновлять графический интерфейс из потока для использования «emit» или QMetaObject :: invokeMethod – user63898

+0

Испускать сигнал кажется намного яснее, чем используя 'invokeMethod', если вам не требуется возвращаемое значение слота в другом потоке. – alexisdm