我需要通过 ARToolKit 视频跟踪库实时收集的 (Boost) 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 服务器生成第二个线程(它不应该被扔在那里,正如我从 Boost 文档中读到的那样)。
否则,试图将视频拖出主线程会使 ARToolKit 库崩溃,即:
boost::thread workerThread(startTracking);
workerThread.join();
当join()
运行时,程序在 glutInit 调用时出现段错误