SophiaFramework UNIVERSE 5.3 |
Fetch 関数で登録したコールバック関数は、 ストレージのデータの終端まで読み込んだとき、または ストレージから読み込んだデータでストリームバッファが満杯になったときに起動されます。
一方、Flush 関数で登録したコールバック関数は、 ストリームバッファのデータをすべてストレージに書き込んだときに起動されます。
上記以外のタイミングでコールバック関数を起動するには、 SetTrigger 関数を利用します。
例えば、 TCP ソケット通信において "\r\n"(改行文字) を読み込んだタイミングをトリガーにしてコールバック関数を起動する方法は以下の通りです。
例 17.28. SetTrigger 関数を利用したコールバック関数の起動
// 一部抜粋 // 接続要求の結果が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXTCPSOCKET(MyClass, OnConnect, error) { if (error == SFERR_NO_ERROR) { // データ受信用ストリームを取得する // ※ size 引数を指定していないのでストリームバッファは可変長 if ((error = _socket.GetStreamReader(&_reader)) == SFERR_NO_ERROR) { // "\r\n"(改行文字) を読み込んだタイミングをトリガーに設定する if ((error = _reader.SetTrigger("\r\n", 2) == SFERR_NO_ERROR) { // フェッチを行う: 実際にソケットからストリームバッファにデータを受信する // ※ データ受信(フェッチ)の結果は、OnFetch 関数に通知される error = _reader.Fetch(XALLBACK_INTERNAL(OnFetch)); } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき // データ受信用ストリームを解放する _reader.Release(); // ソケットを閉じる _socket.Close(); } return; } // データ受信(フェッチ)の結果が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error) { SFXAnsiString string; if (error == SFERR_NO_ERROR) { if (_reader.Triggers()) { // トリガーによりコールバック関数が呼ばれたかどうか TRACE("This callback function has been triggered by reading CRLF."); } // ストリームバッファから string 変数にデータを読み込む if ((error = _reader.ReadSFXAnsiString(&string)) != SFERR_NO_ERROR) { // 受信したデータをデバッグウィンドウに表示する TRACE("--------"); TRACE("%s", string.GetCString()); TRACE("--------"); if (!_reader.Ends()) { // 受信するデータがまだあるとき: // フェッチを行う: 実際にソケットからストリームバッファにデータを受信する // ※ データ受信(フェッチ)の結果は、OnFetch 関数に通知される error = _reader.Fetch(XALLBACK_INTERNAL(OnFetch)); } else { // すべてのデータを受信したとき: // データ受信用ストリームを解放する _reader.Release(); // ソケットを閉じる _socket.Close(); } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき // データ受信用ストリームを解放する _reader.Release(); // ソケットを閉じる _socket.Close(); } return; }
注意 | |
---|---|
size 引数だけを指定して SetTrigger 関数を呼び出した場合、 ストレージに対して指定した長さのデータを読み書きしたタイミングがコールバック関数起動のトリガーになります。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |