プログラムに問題があると思います。外部の追跡システムと継続的に通信し、そこからポイントの座標を取得するオブジェクトを作成する必要があります。このクラスをboost::thread内にラップし、Glutアプリケーションを最初に呼び出す前に、スレッドオブジェクトを作成してデタッチします。
クラスの顕著なメソッドのコードは次のとおりです
boost::mutex resourceMutex;
void Tracker::init()
{
boost::mutex::scoped_lock lock(resourceMutex);
try
{
// some initializations
}
catch (std::bad_alloc const&)
{
cerr << "Memory allocation fail during init!" << endl;
}
try
{
p3dData = (Position3d*)calloc( NUM_MARKERS , sizeof( Position3d ) );
if ( p3dData==NULL )
throw std::bad_alloc();
}
catch ( std::bad_alloc const&)
{
cerr << "Memory allocation fail during memory allocation!" << endl;
}
}
void Tracker::update()
{
boost::mutex::scoped_lock lock(optotrakResourceMutex);
//... operations on vector< Eigen::Vector3d > points
}
vector<Eigen::Vector3d> &Tracker::getAllPoints()
{
return points;
}
私のglutTimerFuncは、すべてのフレームがメソッドgetAllPointsを使用してポイントを選択する更新関数を呼び出しますが、トラッカースレッドはそれらを継続的に更新します(実際、データへのアクセスの頻度は異なりますが、スレッドの呼び出しはglut更新関数よりも高速です呼び出します。
プログラムが終了すると、最初にnewで割り当てられたTrackerオブジェクトを削除してから、それを含むスレッドを中断しますが、メモリリークであると思われる奇妙な動作が発生することがあります。
さまざまなアクセス頻度とscoped_lockの使用でデータを取得する方法は正しいですか、それともgetAllPointsメソッドに何らかの注意を払う必要がありますか?