【问题标题】:C++ How to make a dll modify a variable from main thread?C ++如何使dll从主线程修改变量?
【发布时间】:2012-11-01 20:05:28
【问题描述】:

我目前有一个 dll 可以帮助我进行一些操作,我希望我的 dll 可以修改主线程的变量。我是否以某种方式将类(变量具有类的类型名)发送到 dll,我是否也应该让 dll 包含定义类的文件(.h 文件)。

所以基本上,我怎样才能让一个 dll 从另一个线程(在这种情况下,主线程)修改一个变量?

编辑:

我要改变的变量是这样的:

组 InstancedMesh

Group 是一个模板类,而 UMesh 是另一个类。

【问题讨论】:

  • 传递一个指向它的指针?你希望它修改什么样的变量?
  • 仍不清楚。除了并发问题,是什么阻止你像其他变量一样修改它? C++ 范围规则不受线程或 dll 的影响...
  • 当我尝试包含 UMesh.h(UMesh 声明所在的位置)时,它给了我很多与此无关的错误,这让我很困惑,所以我认为会有不同的方法来做到这一点。
  • (a) 你如何让 any 函数修改作为参数传入的变量,然后 (b) 是什么让你认为 DLL 函数会有所不同?通过引用(或地址)传递变量并修改它们。如果在 DLL 中包含标头会导致无数错误,那么您还有其他问题需要首先解决。
  • 你的问题的多线程部分是什么?

标签: c++ multithreading variables dll


【解决方案1】:

我是否以某种方式将类(变量具有类的类型名)发送到 dll,我是否也应该让 dll 包含类所在的文件 已定义(.h 文件)。

不,您不应使您的库依赖于某些应用程序类型。这个库如何用于其他应用程序?


您的库应仅接受该库已知类型的对象。

所以,您的应用程序中有该类型:

template <class T>
class Group;

你想要一些库函数接受这种类型的对象。

有两种典型的解决方案:

第一个解决方案,将其命名为面向对象的解决方案,在您的库中创建一个接口并接受实现此接口的对象的函数:

class SomInterface {
public:
  virtual void foo1() = 0;
  virtual void foo2() = 0;
};

void doSomething(SomeInterface& object);

然后在你的应用程序中使用doSomething,你的类应该从这个接口派生:

template <class T>
class Group : public SomeInteface {
public:
  virtual void foo1() {...}
  virtual void foo2() {...}
};
Group<UMesh> object;
doSomething(object);

或者(我更喜欢这个)从你的类中创建一个适配器到这个接口:

template <class T>
class GroupSomeInterface : public SomeInteface {
public:
  GroupSomeInterface(Group<UMesh& object) : object(object) {}
  virtual void foo1() {...}
  virtual void foo2() {...}
private:
  Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);

第二种解决方案,将其命名为通用解决方案,由于您有模板类,因此对于这种特殊情况应该更好。在你的库中创建一个函数模板,接受任何类型的接口:

template <class T>
void doSomething(T& object);
Group<UMesh> object;
doSomething(object);

如果您的Group&lt;T&gt; 没有此方法所需的接口,则像第一个解决方案一样制作适配器 - 但这次没有显式接口类且没有虚拟:

template <class T>
class GroupSomeInterface  {
public:
  GroupSomeInterface(Group<UMesh& object) : object(object) {}
  void foo1() {...}
  void foo2() {...}
private:
  Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);

顺便说一句,对象接口是指它的所有公共函数和在这个对象上运行的所有全局函数(例如operator &lt;&lt; (ostream,Object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多