我正在设计一个使用MFC进行UDP通信的服务器。我有以下课程
我在CController中创建CConnectionManager的对象作为CController中的成员变量,在CMyDialog中创建CController的对象作为成员变量。
当用户键入内容并按下send时,我在CControler中调用一个方法,该方法将调用CProtocolManager中的方法来构造数据包并调用CConnectionManager方法发送它。
当我收到一些数据时,它会在CConnectionManager的一个线程中处理。我正在创建一个CController的本地对象并调用一个方法,该方法将数据传递给CProtocolManager进行解码。
现在我想告知用户界面有关数据的信息,CControler应该怎么做?我可以通过使主对话框处理为全局来向UI发布消息,这是一种正确的方法。
还要告诉我这个设计是否正确。
提前致谢
答案 0 :(得分:0)
似乎你在一个线程中完成所有操作。由于数据包来回需要时间,因此建议在不同的线程中完成耗时的工作,并在UI线程上发布状态/结果。 (或者UI将被冻结)。
答案 1 :(得分:0)
我认为设计永远不对或错,但您可以根据许多人认为“好”的原则对其进行评分(参见the SOLID principles)。
您的发送方式听起来很合理,但将Dialog设为全球接收绝对被认为“不太好”。见the hollywood principle。我建议你最好把一个回调方法传递给你的连接管理器,这是CController的一个方法(然后让CProtocolManager解码它并从对话框中调用另一个回调方法)。如果回调不是您想要的,您可以使用方法
将AbstractBaseClasses(ABC)定义为“AbstractMessageReceiver” virtual void receive(const char*, int length) = 0;
然后,您可以在CProtocolManager中实现此ABC,将其作为“AbstractMessageReceiver *”传递给CConnectionManager,然后调用
m_myMessageReceiver->receive(m_buffer, m_length);
或类似的东西。
这种方法减少了耦合,更加可测试并提高了可重用性。
此外,我同意Am你应该考虑你的线程模型!