I ont un objet fonctionnel que j'utilise comme corps pour multifunction_node:Problèmes avec objet imbriqué dans l'objet fonctionnel du TBB :: :: flux graphique
class module
{
private:
bool valid;
QString description;
bool hasDetectionBranch;
tDataDescription bufData;
void* dllObject; //<-- This is a pointer to an object constructed with help of the external dll
qint64 TimeOut;
public:
module(const QString& _ExtLibName);
virtual ~module();
void operator() (pTransmitData _transmitData, multi_node::output_ports_type &op);
};
« dllObject » est créée au moment de la construction de l'objet 'module':
module::module(const QString& _ExtLibName) :
valid(true), hasDetectionBranch(false)
{
GetObjectDescription = (tGetObjectDescription)QLibrary::resolve(_ExtLibName, "GetObjectDescription");
CreateObject = (tCreateObject)QLibrary::resolve(_ExtLibName, "CreateObject");
DestroyObject = (tDestroyObject)QLibrary::resolve(_ExtLibName, "DestroyObject");
if (!CreateObject || !DestroyObject || !GetObjectDescription)
valid = false;
else
{
description = QString(GetObjectDescription());
dllObject = CreateObject();
}
}
Et ceci est quand 'dllObject' est détruite:
module::~module()
{
if (valid)
{
DestroyObject(dllObject);
}
}
J'ai construit un petit graphique :
void MainWindow::goBabyClicked(void)
{
module mod(QString("my.dll")); //<-- Here is OK and mod.dllObject is correct
if (!mod.isValid())
{
qDebug() << "mod is invalid!\n";
return;
}
first fir(input);
folder fol(QString("C:/out"), 10000);
graph g;
source_node<pTransmitData> src(g, fir, false);
multi_node mnode(g, tbb::flow::serial, mod); //<-- WTF? ~module() is executed!
function_node<pTransmitData> f(g, tbb::flow::serial, fol);
make_edge(src, mnode);
make_edge(mnode, f);
src.activate();
g.wait_for_all();
}
J'ai donc 2 questions: 1) Pourquoi ~ module() est exécutée et comment empêcher cela? 2) Comment conserver correctement le pointeur de l'objet imbriqué?
MISE À JOUR Ajout du code factice pour empêcher la destruction dllObject à la première fois comme:
bool b = false;
module::~module()
{
if (valid && b)
{
DestroyObject(dllObject);
}
if (!b)
b = true;
valid = false;
}
Maintenant, il fonctionne comme prévu, mais semble laid:/
Qu'est-ce 'multi_node'? Je ne suis pas familier avec TBB Flow Graph mais j'ai essayé de le chercher. La classe avec le nom le plus proche que j'ai trouvé était ['multifunction_node'] (https://www.threadingbuildingblocks.org/docs/help/index.htm) ... –