2015-10-30 10 views
0

嵌套的对象问题我有我使用作为体multifunction_node的功能对象:在施工时被创建与所述TBB ::流的功能对象::图表

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”对象 '模块':

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(); 
    } 
} 

而且这是在 'dllObject' 被破坏:

module::~module() 
{ 
    if (valid) 
    { 
     DestroyObject(dllObject); 
    } 
} 

我已经建立了一个小图:

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(); 
} 

所以我有2个问题: 1)为什么〜模块()被执行以及如何防止这种情况? 2)如何正确保持嵌套对象的指针?

UPDATE增加了一些假的代码,以防止在第一时间摧毁dllObject像:

bool b = false; 
module::~module() 
{ 
    if (valid && b) 
    { 
     DestroyObject(dllObject); 
    } 
    if (!b) 
     b = true; 
    valid = false; 
} 

现在的作品如预期,但看起来很难看:/

+0

什么是'multi_node'?我不熟悉TBB流程图,但我试图寻找它。我找到的名字最接近的类是['multifunction_node'](https://www.threadingbuildingblocks.org/docs/help/index.htm)... –

回答

1

最大,

我想你有一个typedefmulti_node,它与参考手册中的例子类似。

multifunction_node的构造具有以下特征:

multifunction_node(graph &g, size_t concurrency, Body body); 

参数传递过程中和也节点的施工过程中,体对象被复制,所以有施工过程中创建的mod两个拷贝(实际上是三个,作为身体的初始副本也被存储用于在调用reset()rf_reset_bodies时重新初始化身体)。你看到的析构函数调用可能是用来销毁副本的。

正文对象还应该有一个复制构造函数定义或能够接受默认复制构造函数来制作正文的副本。我认为QString有一个复制构造函数的定义,但我不知道像tDataDescription这样的字段。 (我认为我们已经在参考手册中介绍了Body对象的基本要求,但我仍然在寻找该部分。)在任何情况下,Body类都必须是CopyConstructible,因为它被复制多次。

Regards, Chris

+0

Mike找到了参考;它位于“参考指南”的“流程图”下,multifunction_node上的页面对主体有要求。对于continue_node,function_node和source_node(使用Body的节点)重复。 – cahuson