TNB Library
TnbSharedQueue.h
[詳解]
1#pragma once
15#include "TnbQueue.h"
16#include "TnbSharedMemory.h"
17#include "TnbSync.h"
18
19
20
21//TNB Library
22namespace TNB
23{
24
25
26
48template<typename TYP, size_t SIZ=10000>
49class CSharedQueueT : public ICollectionMidT<TYP> , public IQueueT<TYP> , CCopyImpossible
50{
51 DEFSUPER(ICollectionMidT<TYP>);
52
54 struct TInfo
55 {
56 size_t bufferSize;
57 size_t dataSize;
58 INDEX readIndex;
59 INDEX addIndex;
60 TYP atData[SIZ];
61 };
62
63 CSharedStructT<TInfo> m_ssInfo;
64 CSyncMutex * m_psyncData;
65
67 class CSmOpenListener : public CSharedStructT<TInfo>::IListener
68 {
69 public:
70 virtual void OnAction(TInfo* P)
71 {
72 P->bufferSize = SIZ;
73 P->dataSize = 0;
74 P->readIndex = 0;
75 P->addIndex = 0;
76 }
77 };
78
79protected:
80
87 virtual const TYP* m_GetConstPointer(INDEX index) const
88 {
89 if ( m_psyncData == NULL ){ return NULL; }
90 if ( ! IsInRange(index) ){ return NULL; }
91 INDEX tmp = (m_ssInfo->readIndex) + index;
92 tmp %= (m_ssInfo->bufferSize);
93 return &(m_ssInfo->atData[tmp]);
94 }
95
102 virtual TYP* m_GetPointer(INDEX index)
103 {
104 if ( m_psyncData == NULL ){ return NULL; }
105 if ( ! IsInRange(index) ){ return NULL; }
106 INDEX tmp = (m_ssInfo->readIndex) + index;
107 tmp %= (m_ssInfo->bufferSize);
108 return &(m_ssInfo->atData[tmp]);
109 }
110
111public:
112
118 CSharedQueueT(bool boCanClose = true) : _super(), m_ssInfo(boCanClose)
119 {
120 m_psyncData = NULL;
121 }
122
126 virtual ~CSharedQueueT(void)
127 {
128 Close();
129 }
130
139 bool Open(LPCTSTR lpszName)
140 {
141 Close();
142 CSmOpenListener l;
143 if ( m_ssInfo.Open(lpszName,&l) )
144 {
145 m_psyncData = new CSyncMutex(false, CStr::Fmt(_T("%s_Sync"), lpszName));
146 if ( m_psyncData == NULL )
147 {
148 m_ssInfo.Close();
149 }
150 }
151 return m_psyncData != NULL;
152 }
153
159 void Close(void)
160 {
161 m_ssInfo.Close();
162 if ( m_psyncData != NULL )
163 {
164 delete m_psyncData;
165 m_psyncData = NULL;
166 }
167 }
168
177 virtual bool Lock(DWORD dwTime = INFINITE) const
178 {
179 if ( m_psyncData == NULL ){ return false; }
180 return m_psyncData->Lock();
181 }
182
184 virtual void Unlock(void) const
185 {
186 if ( m_psyncData == NULL ){ return; }
187 m_psyncData->Unlock();
188 }
189
194 virtual size_t GetSize(void) const
195 {
196 if ( m_psyncData == NULL ){ return 0; }
197 return m_ssInfo->dataSize;
198 }
199
209 virtual INDEX Add(const TYP& t)
210 {
211 size_t r = GetSize();
212 return (AddElements(1, &t) == 1) ? r : INVALID_INDEX;
213 }
214
220 virtual bool RemoveAll(void)
221 {
222 if ( m_psyncData == NULL ){ return true; }
223 return TakeElements(m_ssInfo->dataSize) != INVALID_SIZE;
224 }
225
235 virtual size_t AddElements(size_t size, const TYP* P = NULL)
236 {
237 if ( m_psyncData == NULL )
238 {
239 return INVALID_SIZE;
240 }
241 EXCLUSIVE(m_psyncData);
242 if ( (m_ssInfo->dataSize) + size > (m_ssInfo->bufferSize) )
243 {
244 return INVALID_SIZE; //それ以上になるならエラー
245 }
246 size_t bs = m_ssInfo->bufferSize;
247 INDEX tmp = m_ssInfo->addIndex;
248 if ( P != NULL )
249 {
250 loop ( i, size )
251 {
252 m_ssInfo->atData[tmp++] = *P++;
253 if ( tmp >= bs )
254 {
255 tmp -= bs;
256 }
257 }
258 }
259 else
260 {
261 loop ( i, size )
262 {
263 m_ssInfo->atData[tmp++] = TYP();
264 if ( tmp >= bs )
265 {
266 tmp -= bs;
267 }
268 }
269 }
270 (m_ssInfo->addIndex) += size;
271 (m_ssInfo->addIndex) %= bs;
272 (m_ssInfo->dataSize) += size;
273 return size;
274 }
275
285 virtual size_t TakeElements(size_t size, TYP* P = NULL)
286 {
287 if ( m_psyncData == NULL )
288 {
289 return INVALID_SIZE;
290 }
291 EXCLUSIVE(m_psyncData);
292 if ( (m_ssInfo->dataSize) < size )
293 {
294 return INVALID_SIZE; //キューにその長さの情報がないのでエラー
295 }
296 size_t bs = m_ssInfo->bufferSize;
297 if ( P != NULL )
298 {
299 INDEX tmp = m_ssInfo->readIndex;
300 loop ( i, size )
301 {
302 *P++ = m_ssInfo->atData[tmp];
303 if ( ++tmp >= bs )
304 {
305 tmp -= bs;
306 }
307 }
308 }
309 (m_ssInfo->readIndex) += size;
310 (m_ssInfo->readIndex) %= bs;
311 (m_ssInfo->dataSize) -= size;
312 return size;
313 }
314
320 size_t GetFreeSize(void) const
321 {
322 if ( m_psyncData == NULL )
323 {
324 return 0;
325 }
326 return (m_ssInfo->bufferSize) - (m_ssInfo->dataSize);
327 }
328
329private:
330 friend class CSharedQueueTest;
331};
332
333
334
335}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
キュー型情報管理関係のヘッダ
共有メモリ関係のヘッダ
同期処理関係のヘッダ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:91
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
共有キュー型情報管理テンプレート
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CSharedQueueT(bool boCanClose=true)
コンストラクタ
virtual size_t TakeElements(size_t size, TYP *P=NULL)
[取得] 複数要素取り出し.
virtual bool RemoveAll(void)
[削除] データ全削除.
virtual size_t AddElements(size_t size, const TYP *P=NULL)
[追加] 複数要素追加.
size_t GetFreeSize(void) const
[取得] 格納可能数取得.
void Close(void)
[設定] クローズ このメソッドを行なうとコレクションとして使用できなくなります。
virtual ~CSharedQueueT(void)
デストラクタ
virtual INDEX Add(const TYP &t)
[追加] 要素追加.
friend class CSharedQueueTest
フレンドクラス宣言
virtual void Unlock(void) const
[排他] アンロック
virtual const TYP * m_GetConstPointer(INDEX index) const
[取得] 要素アドレス取得
bool Open(LPCTSTR lpszName)
[設定] オープン
virtual TYP * m_GetPointer(INDEX index)
[取得] 要素アドレス取得
void Close(IListener *piListener=NULL)
[操作] クローズ
bool Open(LPCTSTR lpMemName=NULL, IListener *piListener=NULL)
[操作] オープン
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
Mutex排他管理クラス
Definition: TnbSync.h:273
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSync.h:327
情報群管理操作インターフェース拡張テンプレート
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
キュー型情報管理インターフェーステンプレート
Definition: TnbQueue.h:43