65.9K
CodeProject 正在变化。 阅读更多。
Home

CFileChangeEvent 类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (9投票s)

1999年12月1日

2分钟阅读

viewsIcon

99206

downloadIcon

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 是一个带有以下属性的 enumFA_CHANGEDFA_REMOVEDFA_CREATED

如何使用这个类?

CFileChangeEvent 派生一个类(例如您的 CDocument 类),并重写 OnFileAlarm。就这些了。

警告:您无法在 OnFileAlarm 中调用 UpdateAllViews 方法。这是因为

线程只能访问它创建的 MFC 对象。这是因为临时和永久的 Windows 句柄映射保存在线程本地存储中,以确保防止来自多个线程的同时访问。

我们如何解决这个问题?

  1. 将单个句柄(如 HWND)而不是 C++ 对象传递给工作线程。然后,线程通过调用适当的 FromHandle 成员函数将这些对象添加到其临时映射中。
  2. 您可以使用一个新的用户定义消息,对应于您的工作线程将执行的不同任务,并使用 PostMessage 将这些消息发布到应用程序的窗口/视图。
    1. 使用 ::RegisterWindowMessage 像这样创建一个用户定义的消息:
      const UINT msgFileChange = ::RegisterWindowMessage("FILECHANGE");

      将此放在应用程序的头文件中,以便您可以在应用程序中的任何地方使用它。

    2. 在您的文档类中,创建一个成员变量来保存指向您想要处理消息的窗口的指针。
      CView *m_pView;
      // This variable must be initialized in your view-class.
    3. 在线程调用的方法中,将消息发布到处理窗口。
      // You can pass wparam, lparam if you wish
      m_pView->PostMessage(msgFileChange);
    4. 在处理视图的头文件中,在消息映射函数中添加以下内容:
      // when you pass wparam, lparam add parameters to this function
      afx_msg void OnFileChange();
    5. 在处理视图的源文件中,在消息映射中添加以下内容:
      ON_REGISTERED_MESSAGE(msgFileChange, OnFileChange)
    6. 在处理视图的源文件中添加 OnFileChange 的源代码。
      void CProcessView::OnFileChange()
      {
          CMyDocument *pDoc = GetDocument();
          pDoc->UpdateAllViews();
      }
© . All rights reserved.