我是C ++ / CLI开发的学习者,最近我遇到了关于事件处理程序的麻烦。
问题是:我想在继承System :: Windows :: Form的winForm类中添加一个自定义事件,并且该事件必须检查本机收集(如std :: deque)。只要队列的大小发生变化,事件就会发生。
我已经尝试在MSDN上找到解决方案了,但我能找到的都是自定义托管的ref类,这不是我需要的。
答案 0 :(得分:0)
从你的问题我假设你的本地集合位于本机代码(一个库,只使用本机c ++的命名空间......)中的某个地方,否则我会假设你在.Net-Environment中完全使用这个集合。那么我想问你为什么不使用其中一个.net集合?
如果我的假设是正确的,并且集合在于本机代码而不是我不知道如何直接实现此通信。我现在用C ++ / CLI编程一段时间了,并没有看到如何在.Net代码作出反应的本机代码中创建“事件”。
但我建议使用observer-pattern或类似的东西,几乎可以作为一个事件。为了不在整个项目中混合使用native和.Net代码,我建议创建一个特殊的观察者类(您的observer
),可以由本机代码(您的subject
)使用,而无需引入.Net代码。它还知道.Net代码(您的winForm
)并进行两者之间的通信。当集合大小发生变化时,此观察者会通过本机代码中的主题进行注释,然后在winForm
中调用该方法。
交互原生c ++< - >的其他信息c ++ / CLI(见下面的评论):
因为在本机代码中存储.Net引用并不是一件简单的事情,所以我建议使用额外的观察者类来封装交互。
在您的情况下,这意味着不要尝试直接将winform
实现为观察者类。使用主题类和winForm
之间的其他本机观察者类,您可以轻松注册观察者,并且您只能在此类中存储托管引用。您有两个选择:
为您的winForm
实施singleton pattern,以获取对您的生活实例表单的引用。引用可以与Type^
一起临时存储。您可以使用它来获取notify-method中的引用。
使用gcroot实现本机观察者类并从头开始存储引用。在这种情况下,你可能需要进行一些演员表。
在这两种情况下,您都会在notify方法中调用winForm
的公共方法,该方法对集合执行任何必须执行的操作。此外,必须为包含此观察者类的项目设置对.Net Framework的引用(当所有类与winForm
位于同一项目中时,应该已经完成)。