Название: [РЕШЕНО] потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 13:39 Товарищи! Не могу вдуплить, в чем проблема! Поведение какое-то ну крайне своеобразное! Приведу кусок кода!
Такой вот main: Код: int main(int argc, char *argv[]) Кусочек GUIAdapter.h : Код: class GUIAdapter : public QObject { И кусочек GUIAdapter.cpp: Код: void GUIAdapter::startMainWindow(){ В чем, собственно, проблема! GUIAdapter (ga) и uMail (ut) работают в разных потоках - первый остается в главном и в нем работает графика, а второй служит "движком" и направляется в отдельный поток. Но при старте оказывается, что все объекты QDeclarativeView, объявленные в GUIAdapter.h и использованные в cpp-шнике каким-то образом перемещаются в поток с uMail - Как такое может быть?? Название: Re: потоки и GUI Отправлено: Bepec от Сентябрь 12, 2012, 13:45 Код: GUIAdapter *ga = new GUIAdapter(ut); Название: Re: потоки и GUI Отправлено: mutineer от Сентябрь 12, 2012, 13:45 Вслед за объектом перемещаются и его чилдрены
Название: Re: потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 13:49 Но ga при этом не перемещается в другой поток! Перемещаются только QDeclarativeView внутри! + ut передается как указатель и используется только для вызова методов uMail. Не бейте, если не понимаю чего-то)
Название: Re: потоки и GUI Отправлено: mutineer от Сентябрь 12, 2012, 13:51 void GUIAdapter::startMainWindow() в каком потоке вызывается? В том же и будет жить созданный в нем QDeclarativeView
Название: Re: потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 13:56 Вызывается вот так:
Код: QObject::connect(ut, SIGNAL(startMainWindow()), Название: Re: потоки и GUI Отправлено: mutineer от Сентябрь 12, 2012, 13:59 Qt::DirectConnection означает что слот будет вызван прямо из места испускания сигнала. А сигнал испускается из объекта ut, который в другом потоке. Значит и слот будет вызван в том же потоке
Название: Re: потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 14:01 Разве?? Я использовал его, искренне веря в
Код: Qt::DirectConnection 1 The slot is invoked immediately, when the signal is emitted. Название: Re: потоки и GUI Отправлено: mutineer от Сентябрь 12, 2012, 14:03 Слот вызовется немедленно, то есть будет непосредственный вызов слота из тела сигнала. Непосредственный вызов между потоками в C++ невозможен
Название: Re: потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 14:07 Вот фак)) Точно) Спасибо большущее!!)) Т.е. как понимаю, используя прямое соединение слот вызывается сразу же, но из потока сигнала, а чтобы этого не происходило, надо использовать дефолтное AutoConnection?
Название: Re: потоки и GUI Отправлено: mutineer от Сентябрь 12, 2012, 14:08 Да, либо QueuedConnection, если хочешь чтобы вызов всегда проходил через EventLoop, независимо от потоков отправителя/получателя
Название: Re: потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 14:12 Большое спасибо!)
Название: Re: [РЕШЕНО] потоки и GUI Отправлено: OKTA от Сентябрь 12, 2012, 14:51 Вот, если кто заглянет:
Код: Signals and Slots Across Threads |