У меня есть приложение с такой структурой: все типы данных (class INode
) хранятся в плагинах (DLL). Некоторые типы данных могут быть нарисованы (если они IDrawable
).
Для загрузки объекта, например, class PointCloudNode: public INode
У меня есть специальный плагин ввода (DLL), который называется class PointCloudParser: public IIOPlugin
, а IIOPlugin
- это поток с некоторыми специфическими функциями: class IIOPlugin: public QThread
.
Все объекты создаются классом NodeFactory
, который является одноэлементным и хранится в отдельной DLL.
И вот проблема:
void PointCloudNode::update()
{
QObject::connect (this,SIGNAL(tmptmp()),this,SLOT(drawObject()));
emit tmptmp();
}
Если я делаю это из какого-либо потока (основного потока или потока входного плагина)
NodeFactory* fab = NodeFactory::getInstance();
boost::shared_ptr<INode> pc(fab->createNode("pointCloud","myPC"));
boost::shared_ptr<IDrawable> dr = boost::dynamic_pointer_cast<IDrawable>(pc);
dr->update();
Обновление запускается, подается сигнал tmptmp()
и слот (drawObject()
) выполняется правильно.
НО
если сделать то же самое, но создать объект в моем плагине ввода, передать общий указатель и выполнить dr->update()
в другой функции, слот drawObject()
никогда не вводится, хотя весь код выполняется (включая connect
и т. д. .).
Чтобы быть более точным, вот плагин ввода:
void PointCloudParserPlugin::doLoad(const QString& inputName, boost::shared_ptr<INode> container)
{
NodeFactory* factory = NodeFactory::getInstance();
boost::shared_ptr<INode> node = factory->createNode("pointCloud", inputName);
// here goes the loading itself, nothing special...
container->addChild(node); //that's the container where I keep all the objects
//boost::dynamic_pointer_cast<IDrawable>(container->getChild(inputName))->update();
//If I uncomment this line, it all works: the slot is launched.
emit loadingFinished(inputName); // it executes the following function
}
Последний излучатель связан с этим:
void GeomBox::updateVisualization(const QString& fileName)
{
boost::shared_ptr<INode> node = container_->getChild(fileName);
boost::shared_ptr<IDrawable> nodeDrawable = boost::dynamic_pointer_cast<IDrawable>(node);
nodeDrawable->update(); //this is the problem line: update() executes, connect() works, but the slot never runs :(
}
Как получилось? Объект node
все время одинаков, он действителен. Каждая строка в запущенном коде QObject::connect
ничего не записывает в окно отладки, сигнал tmptmp()
испускается, но слот drawObject()
в одном случае никогда не достигается? Есть идеи?
Upd.: Если я не наследую IIOPlugin
от QThread
, все работает нормально (т.е. загружает объект в основной поток). Я ожидал, что сигналы / слоты будут работать между потоками ...