0

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します

4

1 に答える 1

0

workerThread.join() メソッドは何をしていると思いますか? この質問に対する答えを見てください。そのため、join メソッドを呼び出すと、それが呼び出されたスレッド (メイン スレッド) がブロックされ、ワー​​カー スレッドが完了するまで待機します。それはあなたが望むものですか?ASIO をそのメイン スレッドで実行するように設定した場合、ASIO I/O ソケット ハンドラはどれも実行できず、実行中のスレッドが join メソッドから凍結されるため、ハングしているように見えます。ARToolKit ライブラリの場合と同様に、その呼び出しがこのメイン スレッドで開始された場合、join メソッドが呼び出されたときにそのスレッドがフリーズするため、それもフリーズしているように見えます。

これが問題でない場合は、さらにコードを提供してください。

于 2013-02-10T03:26:30.853 に答える