- 追加された行はこの色です。
- 削除された行はこの色です。
*第18回目 ストリーム読み込み [#e6e94057]
ファイルのストリーム読み込みを作ってみました。
大きなファイルの必要な部分だけを読み込むことができます。
読み込みバッファには前回作った[[リングバッファ]]を使用しています。
読み込みバッファには第17回目で作ったリングバッファを使用しています。
読み込みにはスレッドを使用してメインスレッドとは非同期でファイルを読み込みします。
また複数のファイルを同時に読み込むことができます。
そのためBGM演奏中にファイルを読み込むと言った事が可能になります。
WindowsやMacOSXの場合は何もしなくてもOS側で同等のことができるようになっているため必要ない機能かもしれません(笑)
**動作環境 [#d23e7416]
ソースファイルは
Windows版はVisualStudio.NET2003用でWin32アプリケーションプロジェクト。
MacOSX版は作り方がわかりません・・・。誰か教えて・・・。
**操作方法 [#ub2c8d03]
1,2,3でファイルの読み込み開始。
フルキーの1,2,3でファイルの読み込み開始。
4,5,6で1,2,3に対応したファイルの読み込み停止。
**実行画面 [#j0677743]
#ref(stream_sample2.png)~
**Streamクラスメンバ [#yf5b963f]
Streamクラスはstandard.h、ringbuffer.cpp/hpp、stream.cpp/hppの5つのファイルから構成されています。
ringbufferは前回作ったものではメモリが足りなくなることが多かったのでnewの変わりにVirtualAllocを使用しました。(Windows専用)
***bool Create(int32_t streamcount, size_t streambuffersize, size_t minimumreadsize, size_t maximumreadsize); [#bb114fe7]
クラスの初期化。CD/DVD-ROMの時はminimumreadsizeを2048の倍数に設定すると効率が良くなる(かも)。
***bool Release(void); [#o879ddd3]
クラスリリース
***int32_t Open(LPCTSTR filepath); [#v53a86bc]
読み込みファイルを開く
***bool Close(int32_t handle); [#w30ee2d9]
ファイルをクローズ
***bool Start(int32_t handle); [#x7bb7736]
読み込み開始
***bool Stop(int32_t handle); [#r8914057]
読み込み停止
***bool Seek(size_t position, int32_t handle); [#j357ae31]
ファイル位置設定
***size_t Tell(int32_t handle); [#p9601067]
ファイル位置取得
***int32_t GetStatus(int32_t handle); [#we30384d]
ステータス取得
|Stream::STATUS_READY|準備完了|
|Stream::STATUS_END|読み込み終了(ファイルの終わりに来た)|
|Stream::STATUS_BUSY|読み込み中|
|Stream::STATUS_STOP|読み込み停止中|
|Stream::STATUS_ERROR|エラー発生|
***size_t GetReadableSize(int32_t handle); [#g89922d2]
読み込み可能なバッファのサイズを取得
***bool Read(void* buffer, size_t size, int32_t handle); [#d1464e3e]
バッファ読み込み
**Streamクラス使用例 [#adc787fd]
1.binをただ読み込むだけのプログラム。
VisualStudio.NET2003だとこんな感じ。
サンプルプログラムとは関係ありません。
#include <windows.h>
#include "standard.h"
#include "stream.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
Stream stream;
int32_t handle;
stream.Create(1, 1024 * 16, 1, 1024 * 16);
handle = stream.Open(_T("1.bin"));
stream.Start(handle);
while(1)
{
size_t readablesize;
readablesize = stream.GetReadableSize(handle);
if(readablesize)
{
char* buffer;
buffer = new char[readablesize];
stream.Read(buffer, readablesize, handle);
// bufferにreadablesizeバイトのデータが入る
// ここでbufferに読み込まれたデータを処理する
delete [] buffer;
}
if(stream.GetStatus(handle) == Stream::STATUS_END)
{
break;
}
}
stream.Release();
return 0;
}
**ダウンロード [#ke6a829a]
***実行ファイル [#rd84f0e0]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/stream_sample2_windows_20090801.zip)~
(MacOSX版)
なし~
***ソースファイル [#a4ab21b4]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/stream_sample2_windows_source_20090801.zip)~
(MacOSX版)
なし~
[[前に戻る>プログラミング]]