Проблемы с вложенным объектом в функциональном объекте таблицы tbb :: flow :: graph

У меня есть функциональный объект, который я использую в качестве тела для multifunction_node:

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::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) Почему ~ module () выполняется и как это предотвратить?
2) Как правильно сохранить указатель на вложенный объект?

ОБНОВИТЬ Добавлен некоторый фиктивный код для предотвращения разрушения dllObject в первый раз, например:

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

Теперь все работает как положено, но выглядит ужасно: /

0

Решение

Максимум,

Я полагаю, у вас есть typedef из multi_node что похоже на пример в справочном руководстве.

Конструктор для multifunction_node имеет следующую подпись:

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

Объект body копируется во время передачи параметров, а также во время создания узла, поэтому существует две копии mod создается во время построения (фактически три, так как первоначальная копия тела также сохраняется для повторной инициализации тела при вызове reset() с rf_reset_bodies). Звонки деструктора, которые вы видите, вероятно, используются для уничтожения копий.

У объекта body также должен быть определен конструктор copy, или он должен быть в состоянии принять конструктор default-copy для создания копий тела. я думаю QString определен конструктор копирования, но я не знаю о таких полях, как tDataDescription, (Я думал, что мы рассмотрели основные требования к объектам Body в Справочном руководстве, но я все еще ищу этот раздел.) В любом случае, класс Body должен быть CopyConstructible, поскольку он копируется несколько раз.

С Уважением,
Крис

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]