ARToolKitビデオトラッキングライブラリによってリアルタイムで収集された(ブースト)tcpサーバー情報を送信する必要があります。
それを行う正しい方法はどれですか?
私は実際にBoostスレッドとasioでそれを行っていますが、私が行うことは悪い方法で行われていると思います(それが機能したとしても)
サーバーを実行するために私が行うことは次のとおりです(ServerクラスのソースはBoostチュートリアルからのものです):
boost::asio::io_service io_service;
Server s(io_service, 2345);
boost::thread bt(boost::bind(&boost::asio::io_service::run, &io_service)); //server in background in a second thread
次に、ビデオトラッキングを開始します
startTracking(); //blocking call in the main thread
このように定義された
void startTracking(){
glutInit(&argc, argv); //global and reachable
if ((gArglSettings = arglSetupForCurrentContext()) == NULL) {
fprintf(stderr, "main(): arglSetupForCurrentContext() returned error.\n");
exit(-1);}
... //init a lot of artoolkit parameters
arVideoCapStart();
argMainLoop( NULL, keyEvent, mainLoop );
}
この(恐ろしい)方法ですべてが機能します。ただし、asioサーバー用に2番目のスレッドを生成することは避けたいと思います(Boostドキュメントから読み取ったように、そこにスローされることは想定されていません)。
そうしないと、ビデオトレースをメインスレッドから外そうとすると、ARToolKitライブラリがクラッシュします。
boost::thread workerThread(startTracking);
workerThread.join();
がjoin()
実行されると、プログラムはglutInit呼び出しでsegfaultsします