This topic has been archived. It cannot be replied.
-
工作学习 / 科技领域杂谈 / C++ OO 程序设计简单问题请教。
-leonardmars(小马识途);
2013-7-17
{1845}
(#8293609@0)
-
你的问题看得一头雾水(因为我不是什么高手),能不能发点伪代码上来,让大家看看你的类怎么定义的,主要的方法以及如何调用。这样可能能解释得比较清楚。
-liyufx(鲤鱼);
2013-7-17
(#8293621@0)
-
呵呵,应该是我写得不清楚,把简单的问题说复杂了。其实我的问题主要两点:(1)对低层函数的访问是不是应该放到USB类里面?从controller类里面怎么访问这些函数?(2)用什么办法让controller对象“知道”USB对象最合适?等我看看能不能把代码发上来。
-leonardmars(小马识途);
2013-7-17
(#8293948@0)
-
1)低层函数的调用和线程同步(锁)都放到USB类2)USB向controller提供封装好的简化的线程安全的服务(public member functions)3)USB和controller是一对多的关系。在controller类中设一指针指向它所使用的USB对象
-vicky2005(孩子她爹);
2013-7-17
(#8293990@0)
-
这个跟我想的差不多。3)里面除了给controller对象传递USB对象的指针,有没有其他的好办法? 还有,我把4个controller 对象放到USB类里面作成员变量。有没有更合理的安排?谢谢。
-leonardmars(小马识途);
2013-7-17
(#8294019@0)
-
1) "除了给controller对象传递USB对象的指针,有没有其他的好办法?" - 这种设计太常用了,有什么问题吗?2) "把4个controller 对象放到USB类里面作成员变量" - USB需要知道controller吗?
-vicky2005(孩子她爹);
2013-7-17
(#8294050@0)
-
(1)没什么问题,就是我最近对指针有点害怕。(2)也是我正在纠结的问题,USB类似无必要知道controller。不过每个controller对象都要独占USB对象的某些资源,似乎让controller对象到USB对象里面去“注册”取得这些资源更合理。否则,错误的重复占用怎么处理?可能是我想多了。
如果USB不知道controller,那么每个controller就应该记住自己使用哪些资源。在调用被包装过底层函数的时候,把这些资源的ID作为参数传递给USB类,这样好像比较合理。
-leonardmars(小马识途);
2013-7-17
{202}
(#8294081@0)
-
USB类应该不用知道Controller,只需要分配资源。最简单的设计是资源分配和释放都在一次调用中完成,下次调用重新分配。多个controller如果同时调用,就只有一个可以进入,其它的等待或者失败,等待一段时间后重试。这样的程序可靠性最高。如果这样不行你的思路也可以。一般可以有一对分配/释放资源的方法,分配时返回一个token给controller, controller记住这个token, 每次用这个token就可以使用资源,用完后释放资源,token失效。这个token就是Controller记住的自己占用的资源。这种设计关键要记得释放资源,尤其是在出错的时候,否则别的Controller就永远无法获得资源了。
-liyufx(鲤鱼);
2013-7-17
{300}
(#8294148@0)
-
我的controller独占的资源是不变的,比如某个控制器占用了那些I/O端口,分配一次就可以了。共享的资源是在USB里面定义的,然后把指针传递给controller。
-leonardmars(小马识途);
2013-7-17
(#8294335@0)
-
要在战略上藐视指针,在战术上重视指针。不过看样子你对C++和OO都只是一知半解。。。
-vicky2005(孩子她爹);
2013-7-17
(#8294260@0)
-
是啊,我C++还没入门,OO更别提了。还有个问题顺便请教,C#和Java好像是没有指针的,那么一个这种情况(一个对象需要使用另一个对象定义的资源)怎么解决呐?
-leonardmars(小马识途);
2013-7-17
(#8294318@0)
-
如果你必须要在你的APP里做这些事情,建议如下:
-autumn_wind(al);
2013-7-17
{590}
(#8294366@0)
-
好像我现在做的就和你说的差不多,我的controller类其实就是你说的user class。我在USb class 里面定义了4个controller instance.
-leonardmars(小马识途);
2013-7-17
(#8294439@0)
-
如果你的controller class不是为了把USB接口抽象化,还有其他逻辑在里面的话,这区别就很大,很不同。由USB_DEVICE_CLASS()可以看做一个CONTAINER,由它分配得到的USB_DEVICE_USER_CLASS()的INSTANCE只包含USB device有关的逻辑,对应一个设备。而具体用户是谁,用户有什么其他的逻辑和处理对USB_DEVICE_CLASS()来说是根本不需要考虑的。
从模块化设计的考虑,用户的controller class应该和USB_DEVICE_USER_CLASS()分开。甚至USB模块提供的接口USB_DEVICE_USER_CLASS()可以完全是一个virtual class。具体实现完全包含在USB模块内部。
当然,如果你的controller class和我说的一致的话,就应该没什么问题了。为了系统设计更清晰,可以将接口虚拟化。
-autumn_wind(al);
2013-7-17
{381}
(#8294463@0)
-
这回才看明白,等我再想想。
-leonardmars(小马识途);
2013-7-17
(#8294478@0)
-
你这个不是static不static的问题。在windows platform上,最规范的做法不是自己去处理设备共享问题,应该给你的device写一个驱动程序,windows已经给你搭好框架处理这些硬件资源的共享问题了。根据你的application需求,决定选择user mode driver还是kernal mode driver。
-autumn_wind(al);
2013-7-17
{92}
(#8294018@0)
-
谢谢。static只是我编程时有了一些想法,不是本贴 的主题。还要写驱动程序?这个有点太夸张了吧?这个驱动程序好像应该已经有了,我所说的底层函数应该还在驱动的上面,相当于驱动给应用程序的接口,也不知道我理解得对不对。
-leonardmars(小马识途);
2013-7-17
(#8294027@0)
-
驱动程序是最规范标准的做法。而且WDF已经提供了框架处理资源共享的问题,写驱动程序的时候程序员不用自己创建和处理什么锁之类的,应该说是规范了程序员的工作。另外,Windows/Linux等平台上,在用户空间直接对硬件进行操作是不规范的做法。
-autumn_wind(al);
2013-7-17
{73}
(#8294045@0)
-
看来我需要学的东西太多了。
-leonardmars(小马识途);
2013-7-17
(#8294058@0)
-
你其实已经知道怎么做了。这里是我的想法。
-geekcode(吉克码工);
2013-7-17
{826}
(#8295204@0)
-
非常感谢你详细的解说,让我先想一下。
-leonardmars(小马识途);
2013-7-17
(#8295260@0)