TNB Library
TnbAsyncWriter.h
[詳解]
1#pragma once
11#include "TnbWriter.h"
12#include "TnbAbstractReport.h"
14#include "TnbThreadDispatch.h"
15
16
17
18//TNB Library
19namespace TNB
20{
21
22
23
50{
51public:
52
66 struct ICommand
67 {
69 virtual~ ICommand(void) {}
75 virtual bool Exec(IWriter& fw) = 0;
76 };
77
78
79 //-------------------------
80
81
83 explicit CAsyncWriter(void)
84 {
85 m_pWriter = NULL;
86 m_threadDispatch.SetListener(this);
87 }
88
90 virtual ~CAsyncWriter(void)
91 {
92 Stop();
93 }
94
101 bool IsAlive(void) const
102 {
103 return (m_pWriter != NULL) ? m_pWriter->CanWrite() : false;
104 }
105
113 bool SetPriority(int priority)
114 {
115 return m_threadDispatch.SetPriority(priority);
116 }
117
127 {
128 Stop();
129 if ( ! pfw->CanWrite() )
130 {
131 return false;
132 }
133 m_pWriter = pfw;
134 return true;
135 }
136
144 bool Start(void)
145 {
146 Stop();
147 if ( m_pWriter == NULL )
148 {
149 return false;
150 }
151 if ( ! m_pWriter->CanWrite() )
152 {
153 return false;
154 }
155 return m_threadDispatch.Start(_T("AsyncWriter:書込"));
156 }
157
163 void Stop(void)
164 {
165 if ( IsAlive() )
166 {
167 Close();
168 }
169 m_threadDispatch.Stop();
170 }
171
181 {
182 return m_OnDispatch(new CWriteCmd(c));
183 }
184
192 bool Seek(int iOffset, IWriter::ESeekMode eSeek = IWriter::TOP)
193 {
194 return m_OnDispatch(new CSeekCmd(iOffset, eSeek));
195 }
196
204 bool SetEnd(void)
205 {
206 return m_OnDispatch(new CSetEndCmd);
207 }
208
215 bool Close(void)
216 {
217 return m_OnDispatch(new CCloseCmd);
218 }
219
226 bool Command(ICommand* piCmd)
227 {
228 return m_OnDispatch(piCmd);
229 }
230
231private:
232
233 CThreadDispatch m_threadDispatch;
234 IWriter* m_pWriter;
235
236 enum{ WMWF_COMMAND = WM_APP };
237
246 virtual bool OnThreadDispatchReceive(UINT nMsg, WPARAM wParam, LPARAM lParam)
247 {
248 if ( nMsg == WMWF_COMMAND )
249 {
250 IWriter* pFw = reinterpret_cast<IWriter*>(wParam);
251 ICommand* piCmd = reinterpret_cast<ICommand*>(lParam);
252 if ( ! piCmd->Exec(*pFw) )
253 {
254 m_threadDispatch.PostMessage(WM_QUIT);
255 }
256 delete piCmd;
257 }
258 return true;
259 }
260
267 bool m_OnDispatch(ICommand* P)
268 {
269 bool b = m_threadDispatch.PostMessage(
270 WMWF_COMMAND, reinterpret_cast<WPARAM>(m_pWriter), reinterpret_cast<LPARAM>(P));
271 if ( ! b )
272 {
273 delete P;
274 return false;
275 }
276 return true;
277 }
278
280 class CWriteCmd : public ICommand
281 {
282 CByteVector m_vb;
283 public:
284 CWriteCmd(const IConstCollectionT<BYTE>& c) { m_vb.Copy(c); }
285 bool Exec(IWriter& fw) { fw.WriteFrom(m_vb); return true; }
286 };
287
289 class CSeekCmd : public ICommand
290 {
291 int m_iOffset;
292 IWriter::ESeekMode m_eSeek;
293 public:
294 CSeekCmd(int iOffset, IWriter::ESeekMode eSeek) { m_iOffset = iOffset; m_eSeek = eSeek; }
295 bool Exec(IWriter& fw) { fw.Seek(m_iOffset, m_eSeek); return true; }
296 };
297
299 class CSetEndCmd : public ICommand
300 {
301 public: bool Exec(IWriter& fw) { fw.SetEnd(); return true; }
302 };
303
305 class CCloseCmd : public ICommand
306 {
307 public: bool Exec(IWriter& fw) { fw.Close(); return false; }
308 };
309};
310
311
312
313}; // TNB
通信関係のヘッダ
情報群管理アダプタ関係のヘッダ
スレッド処理関係のヘッダ
ファイル関係のヘッダ
非同期書き込みクラス
bool Close(void)
[実行] クローズ.
bool Write(const IConstCollectionT< BYTE > &c)
[実行] ファイル書き込み
bool SetPriority(int priority)
[設定] 優先度設定.
bool Seek(int iOffset, IWriter::ESeekMode eSeek=IWriter::TOP)
[実行] シーク
void Stop(void)
[設定] 終了.
bool Command(ICommand *piCmd)
[実行] コマンド
bool IsAlive(void) const
[確認] 開始チェック.
bool SetEnd(void)
[実行] EOFを指定.
bool Start(void)
[設定] 開始.
CAsyncWriter(void)
コンストラクタ
virtual ~CAsyncWriter(void)
デストラクタ
bool SetWriter(IWriter *pfw)
[設定] ライター設定
スレッド処理制御クラス
bool PostMessage(UINT nMsg, WPARAM wParam=0, LPARAM lParam=0) const
[設定] スレッドへPostMessage
bool SetPriority(int priority)
[設定] 優先度設定.
void SetListener(IListener *piListener)
[登録] リスナー登録
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
bool Stop(void)
[設定] スレッド停止
TNB Library
Definition: TnbDoxyTitle.txt:2
非同期書き込みのコマンドインターフェース
virtual bool Exec(IWriter &fw)=0
[処理] 処理
スレッド処理制御のリスナーインターフェース
virtual size_t Copy(const IConstCollectionT< TYP > &c)
[設定] コピー.
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const =0
[操作] シーク.
virtual void Close(void)=0
[操作] クローズ
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
書き込みインターフェース
Definition: TnbWriter.h:36
virtual void SetEnd(void)=0
[設定] EOFを指定.
void WriteFrom(const IConstCollectionT< BYTE > &c)
[保存] 書き込み.
Definition: TnbWriter.h:65
virtual bool CanWrite(void) const =0
[確認] 書込み可能か