2013-02-09 67 views
0

我需要通过ARToolKit视频跟踪库实时收集(Boost)tcp服务器信息进行转发。Boost Asio,异步服务器和视频跟踪

这是正确的做法吗?

我实际上做它用升压线程和ASIO,但我认为我做一个坏的方式(即使它的工作原理)

这里做是我做的运行服务器( Server类的来源是加速教程):

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 doc中读取时,它不应该被抛出)。

否则试图把视频traking出主线程崩溃的ARToolKit库即:

boost::thread workerThread(startTracking); 
workerThread.join(); 

join()在glutInit调用运行程序内存设计缺陷

+1

没有足够的信息来帮助你在这里...... startTracking()是做什么的?它是线程安全的吗? – Chad 2013-02-09 20:11:29

+0

*一切崩溃*是什么意思?段错误?擦除硬盘驱动器? – 2013-02-09 21:14:18

+0

它在glutInit()调用时发生segfaults,或者尝试将它注释到下一次调用segfault,arglSetupForCurrentContext() 我不知道它是线程安全的 – UnableToLoad 2013-02-10 12:14:04

回答

0

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

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

+0

对不起的解释,它不“冻结”,它segfaults。我想要知道哪些是我正在做的事情的正确方式,我的意思是同时运行服务器和视频跟踪,因为我现在如何使用它,我认为我没有在右边使用方式的异步服务器 – UnableToLoad 2013-02-10 12:17:28