I have an app with such structure: all the datatypes (class INode
) are stored in plugins (DLLs). Some of the datatypes can be drawn (if they're IDrawable
).
To load an object of, e.g. class PointCloudNode: public INode
I have a special input plugin (DLL) which is called class PointCloudParser: public IIOPlugin
and IIOPlugin
is a thread with some specific functionality: class IIOPlugin: public QThread
.
All the objects are created by NodeFactory
class which is a singleton stored in separate DLL.
And here's the problem:
void PointCloudNode::update()
{
QObject::connect (this,SIGNAL(tmptmp()),this,SLOT(drawObject()));
emit tmptmp();
}
If I do this from any thread (main thread or the Input Plugin thread)
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();
The update launches, the tmptmp()
signal is emitted, and the slot (drawObject()
) executes correctly.
BUT
if do just the same, but create the object in my Input Plugin, pass over the shared pointer and execute dr->update()
in another function, the slot drawObject()
is never entered though all the code is executed (including connect
, etc.).
To be more precise, here's the Input Plugin:
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
}
The last emit is connected to this:
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 :(
}
How come? The node
object is the same all the way through, it is valid. Every line in code in launched, QObject::connect
doesn't write anything to debug window, the signal tmptmp()
is emitted, but the slot drawObject()
in one case is never reached? Any ideas?
Upd.: If I do not inherit IIOPlugin
from QThread
, everything works fine (i.e. load the object in the main thread). I expected the signals/slots to work across the threads...