0

我需要通过 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 调用时出现段错误

4

1 回答 1

0

你认为 workerThread.join() 方法有什么作用?看看这个问题的答案。因此,调用 join 方法将导致调用它的线程(主线程)阻塞并等待工作线程完成。那是你要的吗?如果您已将 ASIO 设置为在该主线程上运行,那么任何 ASIO I/O 套接字处理程序都将无法执行,因此它看起来会挂起,因为它所在的线程已被 join 方法冻结。同样对于 ARToolKit 库,如果已在此主线程上启动了对它的调用,那么它也会显示为冻结,因为在调用 join 方法时该线程被冻结。

如果这不是您的问题,请提供更多代码。

于 2013-02-10T03:26:30.853 回答