Kinect ツールボックスの KinectRecorder クラスを使用して、Kinect スケルトン ストリームを記録しました。Kinect ツールボックスの KinectReplay クラスを使用して、単体テストで記録されたファイル全体を再生したいと考えています。録音は、埋め込みリソースとしてテスト プロジェクトに追加されます (おそらく関連性はありませんが、以下のコードの説明として)。
私が直面している問題は、KinectReplay クラス (具体的には ReplaySystem クラス) が C# の Task Parallel ライブラリを使用してスケルトン フレームを再生することです。これは、何も変更しなくても、単体テストが KinectReplay.Start() の呼び出しからすぐに戻ることを意味します。
Kinect ツールボックスへの変更はありません:
[Test]
public void CanPlaybackDataInNunitTest()
{
Type thisType = this.GetType();
Stream resourceStream =
thisType.Assembly.GetManifestResourceStream(
thisType.Namespace +".TestDataFiles.testfile.replay");
KinectReplay kinectReplay = new KinectReplay(resourceStream);
kinectReplay.SkeletonFrameReady += (sender, args) =>
{ //breakpoint gets set on this brace, never hit
//test
};
kinectReplay.Start();
// ...
}
「ReplayFinished」.net イベントを KinectReplay クラスに追加し、AutoResetEvent を KinectReplay クラスに追加し、(以下に示す) イベント ハンドラーと WaitHandles を使用したハイブリッド ソリューションを試しました。
public void CanPlaybackDataInNunitTest()
{
Type thisType = this.GetType();
Stream resourceStream =
thisType.Assembly.GetManifestResourceStream(
thisType.Namespace +".TestDataFiles.testfile.replay");
KinectReplay kinectReplay = new KinectReplay(resourceStream);
// Initialize a wait handle to know when replay ends
AutoResetEvent isFinishedWaitHandle = new AutoResetEvent(false);
kinectReplay.SkeletonFrameReady += (sender, args) =>
{ // breakpoint here, never hit
//test
};
kinectReplay.Start();
// subscribe to a new event i added to the KinectReplay class
// This event is invoked when the IsFinished property becomes true
kinectReplay.ReplayFinished += (o, a) =>
{
isFinishedWaitHandle.Set();
};
// the unit test will block here and will not return until the 5 minute timeout
// I know that skeleton data is present within two seconds in the replay data
isFinishedWaitHandle.WaitOne(new TimeSpan(0, 0, 5, 0));
// ....
}
再生データを使用した単体テストでアルゴリズムを実行するという目的で KinectToolbox を使用することが現実的でない場合は、他の解決策を検討します!