TNB Library
TnbDirectoryWatcher.h
[詳解]
1#pragma once
11#include "TnbThread.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
43{
44public:
45
54 struct IListener
55 {
57 virtual ~IListener(void) {}
58
67 virtual bool OnDirectoryChange(DWORD dwFlags) = 0;
68 };
69
70private:
71
72 HANDLE m_hNotify;
73 DWORD m_dwFlags;
74 IListener* m_pListener;
75 TNB::CThread m_thread;
76
81 virtual DWORD Run(void)
82 {
83 while ( m_hNotify != NULL && IsRunnable() )
84 {
85 DWORD r = ::WaitForSingleObject(m_hNotify, INFINITE);
86 if ( r != WAIT_OBJECT_0 || m_hNotify == NULL )
87 {
88 break;
89 }
90 if ( ! m_pListener->OnDirectoryChange(m_dwFlags) )
91 {
92 break;
93 }
94 if ( ! ::FindNextChangeNotification(m_hNotify) )
95 {
96 ASSERT(false);
97 break;
98 }
99 }
100 if ( m_hNotify != NULL )
101 {
102 ::FindCloseChangeNotification(m_hNotify);
103 m_hNotify = NULL;
104 }
105 return 0;
106 }
107
108public:
109
111 CDirectoryWatcher(void) : m_hNotify(NULL), m_pListener(NULL)
112 {
113 }
114
116 virtual ~CDirectoryWatcher(void)
117 {
118 Stop();
119 }
120
137 bool Start(LPCTSTR lpszPath, bool boWithSubDir, DWORD dwFlags, IListener* pListener)
138 {
139 Stop();
140 m_hNotify = ::FindFirstChangeNotification(lpszPath, boWithSubDir, dwFlags);
141 if ( m_hNotify == NULL )
142 {
143 return false;
144 }
145 m_dwFlags = dwFlags;
146 m_pListener = pListener;
147 m_thread.SetRunner(this);
148 if ( ! m_thread.Start(_T("Directory監視")) )
149 {
150 Stop();
151 return false;
152 }
153 return true;
154 }
155
160 void Stop(void)
161 {
162 if ( m_hNotify != NULL )
163 {
164 HANDLE h = m_hNotify;
165 m_hNotify = NULL;
166 ::FindCloseChangeNotification(h);
167 }
168 m_thread.Stop();
169 }
170
176 {
177 return m_thread;
178 }
179};
180
181
182
183}; //TNB
スレッド管理関係のヘッダ
ディレクトリ監視クラス
CThreadStatus & ReferThreadStatus(void)
[参照] 監視スレッド状態参照.
bool Start(LPCTSTR lpszPath, bool boWithSubDir, DWORD dwFlags, IListener *pListener)
[開始] 監視開始
void Stop(void)
[停止] 監視停止
CDirectoryWatcher(void)
コンストラクタ
virtual ~CDirectoryWatcher(void)
デストラクタ
スレッド状態管理クラス
Definition: TnbThread.h:128
スレッド管理クラス
Definition: TnbThread.h:316
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
Definition: TnbThread.h:420
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
Definition: TnbThread.h:505
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
Definition: TnbThread.h:618
TNB Library
Definition: TnbDoxyTitle.txt:2
ディレクトリ監視のリスナーインターフェース
virtual bool OnDirectoryChange(DWORD dwFlags)=0
[通知] 変化通知
virtual ~IListener(void)
デストラクタ
スレッド実行管理ランナーインターフェース
Definition: TnbThread.h:341
bool IsRunnable(void) const
[確認] 実行可能か否か
Definition: TnbThread.h:355