Boost Asio, асинхронный сервер и отслеживание видео

Мне нужно передать через (Boost) TCP-сервер информацию, собранную в режиме реального времени библиотекой отслеживания видео ARToolKit.

Как правильно это сделать?

Я на самом деле делаю это с потоками 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() запускается, программа segfaults при вызове glutInit


person UnableToLoad    schedule 09.02.2013    source источник
comment
Недостаточно информации, чтобы помочь вам здесь... Что делает startTracking()? Является ли он потокобезопасным?   -  person Chad    schedule 10.02.2013
comment
что означает все рушится? Сегфолт? Стереть жесткий диск?   -  person Sam Miller    schedule 10.02.2013
comment
Он segfaults при вызове glutInit() или пытается прокомментировать его segfault для следующего вызова, arglSetupForCurrentContext(). Я не знаю, является ли он потокобезопасным   -  person UnableToLoad    schedule 10.02.2013
comment
@UnableToLoad, возможно, вы не можете вызывать эти функции в неосновном потоке. Взгляните на более подробную документацию.   -  person Igor R.    schedule 10.02.2013
comment
Да, arglSetupForCurrentContext нуждается в этом, но есть ли у меня преимущества использования асинхронного сервера? (как я на самом деле делаю)   -  person UnableToLoad    schedule 10.02.2013


Ответы (1)


Как вы думаете, что делает метод workerThread.join()? Взгляните на ответ на этот вопрос. Таким образом, вызов метода соединения приведет к тому, что поток, из которого он вызывается (основной поток), будет заблокирован и будет ждать завершения рабочего потока. Это то, что вы хотите? Если вы настроили ASIO для работы в этом основном потоке, то ни один из обработчиков сокетов ввода-вывода ASIO не сможет выполняться, и, таким образом, будет казаться, что он завис, потому что поток, в котором он находится, зависает от метода соединения. Аналогично для библиотеки ARToolKit, если вызовы к ней были инициированы в этом основном потоке, то она также будет казаться зависшей, потому что этот поток зависает при вызове метода соединения.

Если это не ваша проблема, пожалуйста, предоставьте больше кода.

person Bob Bryan    schedule 10.02.2013
comment
Извините за плохое объяснение, он не зависает, он segfaults. Что я хочу, так это знать, как правильно делать то, что я делаю, я имею в виду одновременный запуск сервера и видеотрекинга, потому что то, как я использую это сейчас, я не думаю, что использую правильно как асинхронный сервер - person UnableToLoad; 10.02.2013