サンプリングは、サンプリングストップ条件が満たされるか、指定したバッファ領域の最後まで転送し終わるか、またはCntSamplingStop 関数により強制停止された場合に停止します。
サンプリングストップ条件は、CntSetSamplingStopTrigger関数で指定します。
サンプリングバッファの指定は、CntSamplingSetBuffer関数で指定します。
サンプリングが完了したことを確認するために、以下の2つの方法があります。
CntNotifySamplingStop
関数により、サンプリング停止時に指定したウィンドウに対してメッセージを送ることによってサンプリングの完了を確認します。
サンプリング完了のメッセージを受け取ったら、バッファ内のデータを処理してください。
また、CntNotifySamplingCount 関数により、サンプリング途中で指定個数のサンプリングが完了したことを通知することも可能です。
CntGetSamplingStatus
関数によって取得したステータスの、CNTS_STATUS_BMSTOP と CNTS_STATUS_CNTSTOP の両方を監視することにより、サンプリングの完了を確認します。
CntGetSamplingCount
関数により、サンプリング途中で現在のサンプリングデータ数を取得することが可能です。
2つの方法に共通することですが、高速のサンプリングを行っている途中に、デバイスに対するアクセスを行うと、サンプリングが中断する恐れがあります。
CntNotifySamplingCount
関数の通知個数が少ない場合、割り込みが頻発しますし、CntGetSamplingStatus
関数、CntGetSamplingCount
関数の呼び出しによってもサンプリングは一時中断されます。
CntGetSamplingStatus
関数を呼び出した際、第3引き数 Errにエラー情報が入っている場合は、高速サンプリング中に転送エラーが発生したことを示しています。
この転送エラーを回避するためには、CntNotifySamplingCount
関数の通知個数パラメータを大きくする、またはCntGetSamplingStatus
関数、CntGetSamplingCount
関数の呼び出し回数を減らすなどの対策を行ってください。
サンプリングデータの処理や次の転送準備に入る前に、必ず、いずれかの方法で転送が完了していることを確認してから、次の処理を開始するようにしてください。(CntSamplingStop を使用した場合も同様です)
スレッド内で(CntSamplingSetBuffer)を使用してサンプリング用のバッファをセットした場合、
スレッド終了時に、メモリのロックが解除され、サンプリングを強制停止するため、サンプリングが完了するまでスレッドを終了しないでください。