==================================
連続転送
==================================

連続転送を開始すると、SDK内部でデバイスから画像取得を繰り返すようになります。
SDK内部には画像を溜め込むリングバッファが存在し、取得した画像は順次バッファに格納されます。

SDKの内部で1枚画像を取得すると、あらかじめ指定した関数（以下、コールバック関数）が呼び出されるため、その関数内で保存処理等を実行してください。

コールバック関数の実行中は、バッファがロックされ上書きされないようになっています。
コールバック関数の処理に時間をかけると、SDK内部の画像取得が追い付いてしまい、画像取得は待機状態に入ります。
その状況になると、フレーム抜けが発生する可能性が高まります。
回避するには、出来る限りリングバッファ数を多く設定しておく必要があります。

.. note::
   - 1つのバッファはおよそ0.4MBのメモリを消費します。

.. warning::
   - リングバッファ数を増やせばフレーム抜けが防げることを保証するわけではありません。OS上の別ソフトの割込み等によりフレーム抜けが発生する場合があります。



リングバッファ数の設定
==================================

リングバッファ数は下記関数で設定します。

.. code-block:: cpp

    result = PUC_SetRingBufferCount(hDevice, 1024);
    if (PUC_CHK_FAILED(result))
    {
        return;
    }

.. note::
   - 設定可能な最大リングバッファ数はPUC_MAX_RING_BUF_COUNTで定義されています。

連続転送の開始
==================================

 .. code-block:: cpp
 
    FILE* fp;

    _tfopen_s(&fp, _T("test.dat"), _T("wb"));

    result = PUC_BeginXferData(hDevice, RecieveProc, fp);
    if (PUC_CHK_FAILED(result))
	    
        return;
    }

``PUC_BeginXferData`` の引数には、画像の取得毎に呼ばれるコールバック関数へのポインタと、コールバック関数に渡す引数を指定します。
上記の例では、あらかじめオープンしていたファイルポインタを渡しています。

 .. code-block:: cpp

   void RecieveProc(PPUC_XFER_DATA_INFO pXferData, void* arg)
   {
      FILE* fp = (FILE*)arg;
      fwrite(pXferData->pData, pXferData->nDataSize, 1, fp);
   }

コールバック関数では画像をファイルに書き込んでいます。
コールバック関数に時間がかかるとフレーム抜けに繋がるため、出来る限り処理は少なくしてください。


連続転送の終了
==================================

 .. code-block:: cpp
 
    result = PUC_EndXferData(hDevice);
    if (PUC_CHK_FAILED(result))
    {
        return;
    }
