CFileChangeEvent 类






3.69/5 (9投票s)
1999年12月1日
2分钟阅读

99206

2553
一篇文章介绍如何通知应用程序另一个应用程序已更改文件。
引言
本文介绍如何通知应用程序另一个应用程序已更改文件。
我为此创建了 CFileChangeEvent
类。它具有以下方法:
void addFile(const std::string &sFileName)
当您希望收到文件更改通知时,使用此方法。当通知线程运行时,它将被停止并重新启动。
void removeFile(const std::string &sFileName)
当您不再希望收到通知时,使用此方法。当通知线程运行时,它将被停止并重新启动。
void startWatch(void)
此方法启动通知线程。
void stopWatch(void)
此方法停止通知线程。它也在析构函数中调用,因此您知道线程将始终停止。
virtual void OnFileAlarm(FileAlarm nAlarm, const std::string &sFileName)
重写此方法。当文件更改或删除时,将调用此方法。
FileAlarm
是一个带有以下属性的enum
:FA_CHANGED
、FA_REMOVED
、FA_CREATED
。
如何使用这个类?
从 CFileChangeEvent
派生一个类(例如您的 CDocument
类),并重写 OnFileAlarm
。就这些了。
警告:您无法在 OnFileAlarm
中调用 UpdateAllViews
方法。这是因为
线程只能访问它创建的 MFC 对象。这是因为临时和永久的 Windows 句柄映射保存在线程本地存储中,以确保防止来自多个线程的同时访问。
我们如何解决这个问题?
- 将单个句柄(如
HWND
)而不是 C++ 对象传递给工作线程。然后,线程通过调用适当的FromHandle
成员函数将这些对象添加到其临时映射中。 - 您可以使用一个新的用户定义消息,对应于您的工作线程将执行的不同任务,并使用
PostMessage
将这些消息发布到应用程序的窗口/视图。- 使用
::RegisterWindowMessage
像这样创建一个用户定义的消息:const UINT msgFileChange = ::RegisterWindowMessage("FILECHANGE");
将此放在应用程序的头文件中,以便您可以在应用程序中的任何地方使用它。
- 在您的文档类中,创建一个成员变量来保存指向您想要处理消息的窗口的指针。
CView *m_pView; // This variable must be initialized in your view-class.
- 在线程调用的方法中,将消息发布到处理窗口。
// You can pass wparam, lparam if you wish m_pView->PostMessage(msgFileChange);
- 在处理视图的头文件中,在消息映射函数中添加以下内容:
// when you pass wparam, lparam add parameters to this function afx_msg void OnFileChange();
- 在处理视图的源文件中,在消息映射中添加以下内容:
ON_REGISTERED_MESSAGE(msgFileChange, OnFileChange)
- 在处理视图的源文件中添加
OnFileChange
的源代码。void CProcessView::OnFileChange() { CMyDocument *pDoc = GetDocument(); pDoc->UpdateAllViews(); }
- 使用