TNB Library
TnbBufferingReporter.h
[詳解]
1#pragma once
13#include "TnbAbstractReport.h"
14#include "TnbThread.h"
15#include "TnbQueue.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
36{
37public:
38
43 explicit CBufferingReporter(int queueSize = 10000) : m_in(queueSize)
44 {
45 }
46
52 void SetEnvironment(IReport* pReport)
53 {
54 m_in.pReport = pReport;
55 }
56
62 virtual void SetListener(IReport::IListener* piCommListener = NULL)
63 {
64 m_in.pListener = piCommListener;
65 }
66
71 virtual CStr GetReportName(void) const
72 {
73 ASSERT( m_in.pReport != NULL );
74 return m_in.pReport->GetReportName();
75 }
76
82 virtual DWORD GetReportID(void) const
83 {
84 ASSERT( m_in.pReport != NULL );
85 return m_in.pReport->GetReportID();
86 }
87
94 virtual bool IsAlive(void) const
95 {
96 ASSERT( m_in.pReport != NULL );
97 return m_thread.IsAlive() && m_in.pReport->IsAlive();
98 }
99
105 virtual bool IsConnect(void) const
106 {
107 ASSERT( m_in.pReport != NULL );
108 return m_in.pReport->IsConnect();
109 }
110
121 virtual void SetIdleEventMode(int iInterval = 0)
122 {
123 ASSERT( m_in.pReport != NULL );
124 m_in.pReport->SetIdleEventMode(iInterval);
125 }
126
133 virtual bool Start(void)
134 {
135 if ( m_in.pReport != NULL )
136 {
137 if ( m_thread.IsAlive() )
138 {
139 //スレッド停止
140 m_thread.Stop();
141 }
142 m_in.pReport->SetListener(&m_in);
143 if ( m_in.pReport->Start() )
144 {
145 m_thread.SetRunner(&m_in);
146 m_in.event.ToLock();
147 m_in.canRunnable = true;
148 #ifdef _DEBUG
149 m_thread.Start(CStr::Fmt(_T("BufferingReport[%s]:監視"), GetReportName()));
150 #else
151 m_thread.Start();
152 #endif
153 return true;
154 }
155 }
156 return false;
157 }
158
163 virtual void Stop(void)
164 {
165 ASSERT( m_in.pReport != NULL );
166 m_in.canRunnable = false;
167 m_in.event.Unlock();
168 m_in.pReport->Stop();
169 if ( m_thread.IsAlive() )
170 {
171 //スレッド停止
172 m_thread.Stop();
173 }
174 }
175
183 virtual bool Send(size_t dataSize, LPCVOID lpcvData)
184 {
185 ASSERT( m_in.pReport != NULL );
186 return m_in.pReport->Send(dataSize, lpcvData);
187 }
188
193 virtual void Purge(void)
194 {
195 ASSERT( m_in.pReport != NULL );
196 m_in.pReport->Purge();
197 }
198
204 {
205 return m_thread;
206 }
207
208private:
211 {
212 DEFPARENTLISTENER(CBufferingReporter, IParentListener);
213
214 IReport* pReport;
215 IParentListener* pListener;
217 CSyncEvent event;
218 bool canRunnable;
220 TInner(int queueSize = 10000) : queue(queueSize), event(true, true), pReport(NULL), pListener(NULL)
221 {
222 }
224 virtual bool OnReportEvent(const CReportEvent& ev)
225 {
226 if ( pListener != NULL )
227 {
228 if ( ev.HasEvent() )
229 {
230 return pListener->OnReportEvent(ev);
231 }
232 CByteVector vb;
233 vb.SetElements(ev.GetDataSize(), ev.GetData());
234 queue.Add(vb);
235 event.Pulse();
236 TRACE0("a1\n");
237 }
238 return true;
239 }
241 virtual DWORD Run(void)
242 {
243 while ( IsRunnable() && canRunnable )
244 {
245 ::WaitForSingleObject(event, 100000);
246 TRACE0("p1\n");
247 while ( ! queue.IsEmpty() )
248 {
249 queue.Lock();
250 CByteVector vb = queue.Take();
251 queue.Unlock();
252 if ( pListener != NULL )
253 {
254 CReportEvent e(pReport);
255 e.SetData(vb.GetSize(), vb.ReferBuffer());
256 pListener->OnReportEvent(e);
257 }
258 }
259 }
260 TRACE0("p2\n");
261 return 0;
262 };
263 };
264 TInner m_in;
265 CThread m_thread;
266};
267
268
269
270}; // TNB
271
通信関係のヘッダ
キュー型情報管理関係のヘッダ
スレッド管理関係のヘッダ
通信アクセス抽象クラス
ブロック付キュー型情報管理テンプレート
Definition: TnbQueue.h:559
バッファリングレポータークラス
CThreadStatus & ReferThreadStatus(void)
[参照] 受信スレッド状態参照.
virtual void Stop(void)
[操作] 通信レポート停止.
virtual void SetIdleEventMode(int iInterval=0)
[設定] アイドルイベント設定
virtual bool Send(size_t dataSize, LPCVOID lpcvData)
[送信] データ送信
virtual CStr GetReportName(void) const
[取得] レポート名.
virtual DWORD GetReportID(void) const
[取得] レポート ID.
CBufferingReporter(int queueSize=10000)
コンストラクタ
virtual void SetListener(IReport::IListener *piCommListener=NULL)
[登録] 共通 Listner 登録.
virtual void Purge(void)
[設定] パージ.
virtual bool IsConnect(void) const
[確認] 接続されているか
virtual bool IsAlive(void) const
[確認] Aliveチェック.
virtual bool Start(void)
[操作] 通信レポート開始.
void SetEnvironment(IReport *pReport)
[設定] 環境設定.
通信受信イベント管理クラス
Definition: TnbReport.h:70
size_t GetDataSize(void) const
[取得] データ長取得
Definition: TnbReport.h:139
bool HasEvent(void) const
[確認] Event(Error)を持っている
Definition: TnbReport.h:130
const BYTE * GetData(void) const
[取得] データアドレス取得
Definition: TnbReport.h:148
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbQueue.h:213
virtual INDEX Add(const TYP &t)
[追加] 要素追加.
Definition: TnbQueue.h:277
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbQueue.h:219
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
Event排他管理クラス
Definition: TnbSync.h:480
スレッド状態管理クラス
Definition: TnbThread.h:128
bool IsAlive(void) const
[確認] スレッドが生きているか
Definition: TnbThread.h:177
スレッド管理クラス
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
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
virtual size_t SetElements(size_t size, const TYP *P=NULL)
[設定] 複数要素設定.
Definition: TnbVector.h:526
TNB Library
Definition: TnbDoxyTitle.txt:2
スレッド実行管理ランナーインターフェース
Definition: TnbThread.h:341
bool IsRunnable(void) const
[確認] 実行可能か否か
Definition: TnbThread.h:355
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual TYP Take(void)
[取得] 先頭要素取り出し.
Definition: TnbQueue.h:85
通信のリスナーインターフェース
Definition: TnbReport.h:243
通信アクセスインターフェース
Definition: TnbReport.h:227