Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;应用与硬件通信_C++_Oop_Hardware_Communication - Fatal编程技术网

C++ C++;应用与硬件通信

C++ C++;应用与硬件通信,c++,oop,hardware,communication,C++,Oop,Hardware,Communication,问题主要是面向对象的设计问题。 我有一个类处理与硬件的连接和通信(比如通过USB)-CommClass。它有几种方法-connect(),disconnect(),read(),write()。 应用程序本身很少有其他类希望通过CommClass与同一硬件通信。 问题是——你通常是怎么做的? 我脑子里没有什么想法: 在父类中或在CommClass的主创建实例中,调用connect()并获取指向所有类(构造函数)的指针。最后-断开连接() 每个类中的每个方法在需要时将在堆栈中创建一个CommCla

问题主要是面向对象的设计问题。 我有一个类处理与硬件的连接和通信(比如通过USB)-
CommClass
。它有几种方法-
connect()
disconnect()
read()
write()
。 应用程序本身很少有其他类希望通过CommClass与同一硬件通信。 问题是——你通常是怎么做的? 我脑子里没有什么想法:

  • 在父类中或在
    CommClass
    的主创建实例中,调用
    connect()
    并获取指向所有类(构造函数)的指针。最后-
    断开连接()
  • 每个类中的每个方法在需要时将在堆栈中创建一个
    CommClass
    对象。-这里的问题是,它必须调用
    connect()
    方法,以便在每次
  • 使用
    CommClass
    中的静态方法

  • 如果您希望与设备(比如USB设备)有一个单一连接,那么如果您想拥有更优雅的设计并使用由
    CommClass
    实现的接口,则有必要使用
    CommClass
    icomclass
    的一个实例。您还可以将连接(类或接口)包装成一个,这样您就可以确保只建立和释放一次连接。如果希望在单线程应用程序中一次使用一个连接,那么这种方法最有效。在多线程或多连接环境中,您可以尝试使用设计模式。

    我认为最佳解决方案在很大程度上取决于应用程序的要求和通信连接的性质。在最简单的情况下,您在(1)中描述的内容可能就足够了

    就我个人而言,我几乎总是把COMM放在一个单独的线程中。这有点复杂,但它可以提供显著的速度优势,并确保当通信中发生异常情况时(如USB电缆被拔出),您的UI不会失去响应

    我最常用的设计(RS232通信)与您在(1)中描述的略有不同。我有一个CComms类作为我的主应用程序对象的成员,它创建了一个线程来运行通信。然后我有一个非常简单的消息系统,类似于Windows使用的系统,它处理comms线程和主应用程序之间传递数据的所有线程同步。然后,主应用程序有几个简单的函数从其他类发送comms消息,并将响应发送回相关类


    我希望这有点帮助……

    你回答了自己的问题。让几个模块共享一些CommClass与在它们之间共享一个普通变量没有什么不同。最好的方法是将它作为指针传递给所有使用它的模块。如果您对您的答案不满意,请在此处分享您的问题陈述,同时重新审视问题。找出遗漏的内容。类diagaram或设计始终基于问题陈述。如果问题陈述不清楚,那么没有人能给出好的设计。谢谢链接。这就是我想要的——一些设计模式。现在我必须为这份工作挑选合适的人选。我是这样开始的。线程是一个有点复杂的解决方案,但我喜欢它。我可以再试一次。当硬件响应延迟且用户不断请求时(单击示例中的read()按钮),您如何处理这种情况。这将生成大量事件…我通过在向消息队列添加新消息之前检查消息队列来处理这些事件。如果队列中已经有相同ID/类型的消息,那么我将丢弃它。延迟的硬件响应正是使用单独的线程进行通信时的情况,这是一个好主意-没有它,用户将无法多次单击按钮,因为UI将被锁定。我同意这是一个更复杂的解决方案,但我发现从长远来看,这是值得努力的。