出于学术目的,我已经实现了一个C#库,它实现了“使用代理进行计算”,例如考虑JADE的功能。有了这个库,我可以轻松实现分布式计算算法。每个代理都是一个对象,它有一个不同的线程来实现计算的一部分,而对象本身可以自由地接收和发送消息。
这些算法可以运行数千个代理(所以线程),由超级代理监控,改变它们的状态并同步它们:我不能创建10.000个线程并让它们一起运行,因为PC可能会死...
因此,每个代理都有一个不断变化的状态,我应该在GUI上绘制,让用户意识到计算过程中发生了什么。而且我的代理人也可以在计算过程中被创造和杀死,这使得它变得更难......
我想使用一个网格,其中每个单元格都是代理,根据代理状态改变每个单元格的背景颜色,但我不确定如何将单个代理“加入”单元格(请记住我不能使用索引,因为代理编号可以更改,某些代理可能会被销毁;我想为每个新代理创建一个Control并将此Control放在GUI中,这样我就可以在需要时快速创建,放置和销毁它。
最重要的是大量的线程和尽可能快地刷新GUI的需要,因为线程状态持续且非常快速地变化。
你能提出什么建议?完成任务的最佳方法是什么?
更新:我正在使用Framework 2.0开发这个库,因为它必须使用Mono在Linux下运行。
答案 0 :(得分:0)
我会在非绑定模式下使用Infragistics WinGrid执行此操作。这样,您可以轻松地将agent-object与单元格的标记连接起来,并通过搜索标记来查找单元格。我不建议您为每个代理使用单个控件,因为您可能会遇到严重的性能问题!
答案 1 :(得分:0)
有一个映射线程ID的中央同步hashmap - > GUI元素。 通过这种方式,超级代理可以对GUI进行更改,创建新线程并以原子方式更新散列映射(例如,这允许为新线程重用GUI元素)。当超级代理获得锁定以更新它时,这显然会在hashmap上引起一些读取争用。
编辑:实际上你甚至可以摆脱hashmap并且只有一个数组,因为你可以拥有的最大线程数非常低(<2 ^ 16),我想。这也可以消除争用,因为你可以锁定单个数组元素而不是整个hashmap。
edit2:实际上我刚刚想到你可以摆脱一切。只需要256x256像素的共享表面(即2 ^ 16像素)。每个像素属于线程ID等于像素索引的线程。这样每个线程只访问自己的像素。然后创建一个自定义控件,并让OnPaint方法将共享曲面blit到图形表面。
答案 2 :(得分:0)
我不会纯粹在.NET中这样做,因为farmewok几乎不够强大。求助于MFC或更好的Direct3D,或者,如果您需要Linux支持,请使用OpenGL。这可能是一个开销,但你绝对不会遇到更新问题(至少不会在GUI中)