7.9 KiB
观察者模式
**本文档引用的文件** - [MainFrm.cpp](file://cpp/Views/MainFrm.cpp) - [MainFrm.h](file://h/MainFrm.h) - [devmngframe.cpp](file://cpp/Views/devmngframe.cpp) - [devmngframe.h](file://h/devmngframe.h) - [datamngframe.cpp](file://cpp/Views/datamngframe.cpp) - [sptmngframe.cpp](file://cpp/Views/sptmngframe.cpp) - [Constant.h](file://h/Constant.h) - [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp) - [scheduler.cpp](file://cpp/Scheduler/scheduler.cpp) - [StdThread.cpp](file://cpp/socket/StdThread.cpp)目录
引言
本项目采用MFC框架实现了一个地质探测软件系统,通过MFC的消息映射机制实现了观察者模式。该模式允许UI组件通过消息映射注册对特定事件的兴趣,从而实现组件间的松耦合通信。系统通过DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,结合自定义消息WM_SCHEDULE和WM_REFRESH,实现了界面刷新和任务调度等功能。
Section sources
MFC消息映射机制
MFC消息映射机制是实现观察者模式的核心。在MFC中,DECLARE_MESSAGE_MAP宏用于声明消息映射表,而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏则用于定义消息映射的具体内容。通过这种机制,UI组件可以注册对特定消息的处理函数。
在MainFrm类中,消息映射的定义如下:
classDiagram
class CMainFrame {
+DECLARE_DYNAMIC(CMainFrame)
+BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
+ON_WM_CREATE()
+ON_COMMAND(IDM_MNG_DATA_WIN, OnMngDataWin)
+ON_COMMAND(IDM_MNG_EXEC_WIN, OnMngExecWin)
+ON_COMMAND(IDM_MNG_DEV_WIN, OnMngDevWin)
+ON_MESSAGE(WM_SCHEDULE, OnSchedule)
+ON_MESSAGE(WM_REFRESH, OnRefresh)
+END_MESSAGE_MAP()
}
Diagram sources
Section sources
观察者模式实现分析
观察者模式在本项目中通过消息映射机制实现。UI组件通过消息映射注册对特定事件的兴趣,当事件发生时,系统会自动调用相应的处理函数。
以MainFrm和DevMngFrame为例,它们之间的观察者关系如下:
sequenceDiagram
participant MainFrm as CMainFrame
participant DevMngFrame as CDevMngFrame
MainFrm->>DevMngFrame : SendMessage(WM_REFRESH_NAV_DEVICE)
DevMngFrame->>DevMngFrame : OnRefreshNavDevice()
DevMngFrame->>MainFrm : SendMessage(WM_SCHEDULE)
MainFrm->>MainFrm : OnSchedule()
Diagram sources
Section sources
自定义消息定义与使用
项目中定义了多个自定义消息,用于实现特定的业务逻辑。这些消息在Constant.h文件中定义:
erDiagram
CUSTOM_MESSAGE {
int WM_SCHEDULE PK
int WM_REFRESH
int WM_NEWLINK
int WM_BREAKLINE
int WM_UPG_GEOMATIVE
int WM_REFRESH_NAV_DEVICE
int WM_SHOW_DEV_UPG_INFO
int WM_CLEAR_DEV_UPG_INFO
}
Diagram sources
Section sources
WM_SCHEDULE消息
WM_SCHEDULE消息用于任务调度,由MainFrm类处理:
flowchart TD
Start([开始]) --> CheckScheduler["检查调度器"]
CheckScheduler --> ExecuteScheduler["执行调度任务"]
ExecuteScheduler --> InvalidateToolbar["无效化工具栏"]
InvalidateToolbar --> ShowToolbar["显示工具栏"]
ShowToolbar --> End([结束])
Diagram sources
Section sources
WM_REFRESH消息
WM_REFRESH消息用于界面刷新,支持多种刷新类型:
classDiagram
class CMainFrame {
+OnRefresh(WPARAM wParam, LPARAM lParam)
}
class RefreshType {
+OP_FILE_IMP
+OP_TD_SYN
+OP_SPT_SYN
+OP_DE_F_D
}
CMainFrame --> RefreshType : "使用"
Diagram sources
Section sources
消息发送与处理流程
消息的发送与处理流程是观察者模式的关键。系统使用SendMessage和PostMessage函数来发送消息,并通过消息映射机制进行处理。
消息处理流程如下:
sequenceDiagram
participant Sender as 发送者
participant MessageQueue as 消息队列
participant Receiver as 接收者
Sender->>MessageQueue : PostMessage()
MessageQueue->>Receiver : 消息入队
Receiver->>Receiver : PeekMessage()
Receiver->>Receiver : TranslateMessage()
Receiver->>Receiver : DispatchMessage()
Receiver->>Receiver : 调用消息处理函数
Diagram sources
Section sources
组件间松耦合通信
通过消息映射机制,系统实现了组件间的松耦合通信。各组件通过发送和接收消息进行交互,而不需要直接引用对方。
组件间通信关系如下:
graph TB
subgraph "主框架"
MainFrm[CMainFrame]
end
subgraph "管理框架"
DevMngFrame[CDevMngFrame]
DataMngFrame[CDataMngFrame]
SptMngFrame[CSptMngFrame]
end
MainFrm --> |WM_REFRESH| DataMngFrame
MainFrm --> |WM_SCHEDULE| DevMngFrame
MainFrm --> |WM_SCHEDULE| SptMngFrame
DevMngFrame --> |WM_SCHEDULE| MainFrm
DataMngFrame --> |WM_REFRESH| MainFrm
Diagram sources
Section sources
线程安全性与性能影响
系统的线程安全性和性能影响主要体现在网络操作和消息处理上。NetWorkOper类负责处理网络通信,通过线程安全的机制确保消息的正确传递。
线程安全机制如下:
classDiagram
class CNetWorkOper {
+RegeditRealMsgCall(HWND hWnd)
+UnRegeditRealMsgCall(HWND hWnd)
+ThreadFunction()
+m_listRealHwnd list<HWND>
+m_realHwndCs CRITICAL_SECTION
}
class CAutoLock {
+CAutoLock(CRITICAL_SECTION* pCs)
+~CAutoLock()
}
CNetWorkOper --> CAutoLock : "使用"
CNetWorkOper --> CRITICAL_SECTION : "保护"
Diagram sources
Section sources
结论
本项目通过MFC消息映射机制成功实现了观察者模式。系统使用DECLARE_MESSAGE_MAP宏和AFX_MSG消息处理机制,使UI组件能够注册对特定事件的兴趣。自定义消息WM_SCHEDULE和WM_REFRESH的定义与使用,实现了界面刷新和任务调度功能。通过SendMessage和PostMessage函数,系统实现了组件间的松耦合通信。在MainFrm、DevMngFrame等类的实际应用中,观察者模式有效地管理了界面状态和用户交互。尽管存在一定的线程安全性考虑,但通过临界区保护和线程同步机制,系统能够稳定运行。这种设计模式提高了代码的可维护性和可扩展性,为系统的持续发展奠定了良好基础。