2012-05-14 97 views
2

我想用一个队列来同步访问一个串行端口,这个串行端口在多个独立的代码块之间共享。 每个模块都提供了一个回调函数,当需要时,它将被排队并在串口上精确地处理一个原子操作。 一个计时器然后定期执行所有未决的操作,希望没有干涉。因为我对C++/CLI编程相对比较陌生,所以我能够创建一个系统::集合::队列并且使一些字符串入队;但我不能,在我的生活中,弄清楚如何使用指向我的回调函数的指针(void Test())。C++/CLI:成员函数指针队列

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

我正在使用Microsoft Visual C++ 2010 Express。 希望你能帮助!从德国

问候,

保罗

+0

我通常会避免自己使用委托和幻想回调,并坚持通过继承进行回调,因为这对我更有意义。如果您需要遍历托管/非托管层,那么在C++/CLI中编写包装将不太困难,该包装将充当中间回调层,将呼叫传递到托管环境。至少我认为它比学习将函数编码到函子等更容易。 – Ian

回答

1

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

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

使用托管函数指针作为本地回调如果你有System.Delegate实例的队列中,你需要这个MSDN文章

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

,那么就做D.DynamicInvoke()与列表调用适当的论据。

+0

我_think_你误会了我:我没有任何问题访问串口,因为_System :: IO :: Ports :: SerialPort_适合我。我真正想要做的就是将函数放入队列中(以及在执行之后)。队列,定时器和回调函数实际上都在同一个类中。回调函数没有限制,也可以管理或不管理。 (因此,我的示例函数名称是_void Test()_,它可能也是_System :: Void Test()_。但是请等待,这是否会区分托管和非托管代码?) –

+0

因此,您有一个事件你想在队列中“存储”函数调用,然后在另一个事件中,你想从队列中“弹出”函数调用并执行它?我知道你提到的串口是不相关的,但是将非托管函数指针转换为.NET代表需要一些工作。 –

+0

确切地说;我想我应该让我的观点更清楚。 –