【问题标题】:C++/CLI: Queue of member function pointersC++/CLI:成员函数指针队列
【发布时间】:2012-05-14 16:08:47
【问题描述】:

我想使用队列来同步对多个独立代码块之间共享的串行端口的访问。 每个块都提供一个回调函数,在需要时,该函数将被排入队列并处理串行端口上的一个原子操作。 然后计时器会定期执行所有待处理的操作,希望不会受到干扰。

由于我对 C++/CLI 编程比较陌生,所以我能够创建一个 System::Collections::Queue 并将一些字符串排入队列;但我终其一生都无法弄清楚如何使用指向回调函数的指针(void Test())。

我用谷歌搜索了很多,但即使是最简单的例子也不适合我。所有这些代表、Boost、Marshal、gcnew 的东西现在让我有点困惑。

我正在使用 Microsoft Visual C++ 2010 Express。 希望你能帮忙!

来自德国的问候,

保罗

【问题讨论】:

  • 我自己通常避免使用委托和花哨的回调,并坚持通过继承进行回调,因为这对我来说更有意义。如果您需要遍历托管/非托管层,那么在 C++/CLI 中编写一个包装器并不难,它将充当中间回调层,将调用传递给托管环境。至少我认为它比学习将代表编组到函子等更容易。

标签: function pointers c++-cli queue member


【解决方案1】:

在 .NET/CLR 世界中,System.Delegate 类是函数指针的类似物。

由于您正在做一些低级的事情并且回调是在高级托管环境中编写的,因此需要进行编组。

要将托管函数指针用作本机回调,您需要这篇 MSDN 文章

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer(v=vs.80).aspx

如果您有一个 System.Delegate 实例队列,则只需使用适当参数列表执行 D.DynamicInvoke() 调用。

【讨论】:

  • 认为你误解了我:我在访问串行端口时没有任何问题,因为 System::IO::Ports::SerialPort 有效对我来说没问题。我真正想做的就是将所说的函数放入队列中,然后再退出队列(当然,执行它)。队列、定时器和回调函数实际上都在同一个类中。回调函数没有限制,可以管理也可以不管理。 (因此,我的示例函数名称是 void Test(),它也可能是 System::Void Test()。但是等等,这甚至会影响托管和非托管代码?)
  • 所以你有一个事件,你想在队列上“存储”函数调用,然后在另一个事件上,你想从队列中“弹出”函数调用并执行它?我知道您提到的串行端口无关紧要,但是将非托管函数指针转换为 .NET 委托需要一些工作。
  • 那么你有什么问题(抛开对 .NET 的不熟悉)用代表调用的 System.Delegate 和 object[] 字段声明结构,然后使用此类调用的列表?
猜你喜欢
  • 2018-09-12
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2011-09-09
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多