前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

17.5. トリガーによるコールバック起動

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;
}
[Note] 注意
size 引数だけを指定して SetTrigger 関数を呼び出した場合、 ストレージに対して指定した長さのデータを読み書きしたタイミングがコールバック関数起動のトリガーになります。