C++에서 폴더 변경 모니터 디자인(Windows)

2846 단어 cppdesigntutorial

핫폴더란?



핫 폴더는 다른 폴더와 같습니다. 핫하게 만드는 것은 프로그램(C++로 코딩할 예정)이 변경 사항을 모니터링할 때입니다.

누가 그것을 사용합니까?



소프트웨어 입력은 파일일 수 있습니다. 파일 소스는 카메라 생성 이미지 또는 타사 소프트웨어와 같은 하드웨어일 수 있습니다. 모듈은 입력을 소비하기 위해 폴더의 변경 사항을 감시합니다.

디자인하는 방법?



생각 해봐! 우리에게 필요한 모든 것:

We may heard about observer design pattern. Observers will get notified when a Subject updates. Observer design pattern fits well for this situation.


  • Watcher - OS에서 폴더 변경에 대한 이벤트를 수신하는 개체입니다. 폴더를 보고 있다고 말합니다. Watcher는 업데이트를 받고 관찰자에게 알릴 주체처럼 행동하기 때문에 감시자는 주체입니다.
  • Update Listener - Object는 Subject로부터 받은 변경 목록을 보유합니다. 업데이트 수신기는 관찰자입니다. 모듈은 주제를 수신하고 스레드 안전 컬렉션에 예정된 변경 사항을 추가합니다. 이게 필요해, 왜? 프로듀서가 초당 N개의 파일을 생성하는 시나리오를 가정하지만 모듈과 같은 리스너가 없으면 이전을 처리하는 동안 이벤트를 놓칠 수 있습니다.
  • 핸들러 - 객체는 수신기와 수신기 객체를 각각 인스턴스화합니다.

  • 시작하자!



    먼저 두 가지 기본 인터페이스 'ISubject' 및 'IObject'를 정의합니다.

    template <typename T>
    class ISubject
    {
        public:
            ISubject()          = default;
            virtual ~ISubject() = default;
            virtual AddObserver(const IObserver<T>* pObserver) = 0;
            virtual RemoveObserver(const IObserver<T>* pObserver) = 0;
            virtual NotifyObservers(const T& data) = 0;
    };
    



    template <typename T>
    class IObserver
    {
        public:
            IObserver()          = default;
            virtual ~IObserver() = default;
            virtual Uptdate(const T& data) = 0;
    };
    



    class DirectoryWatcher : public ISubject
    {
        protected:
            std::string _strDirectory;
            HANDLE      _pChangeHandle;
    
            bool IsHandleValid();
            void Reset(const std::string& strDirectory);
    
        public: 
            DirectoryWatcher();
            ~DirectoryWatcher();
    
            bool Start(const std::string& strDirectory);
            void Stop();
            void AddObserver(const IObserver<std::string>* pObserver);
            void RemoveObserver(const IObserver<std::string>* pObserver);
            void NotifyObservers(const T& data);
    };
    
    



    class UpdateListener : public IObserver
    {
        protected:
            code_machina::BlockingCollection<std::string> _changeCollection;
    
        public: 
            UpdateListener();
            ~UpdateListener();
    
            bool Start(const std::string& strDirectory);
            void Stop();
            void AddObserver(const IObserver<std::string>* pObserver);
            void RemoveObserver(const IObserver<std::string>* pObserver);
            void NotifyObservers(const T& data);
    };
    
    


    자세한 내용은 댓글을 달아주세요!

    좋은 웹페이지 즐겨찾기