Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, работающие кроссплатформенно.. треды, кои используются под разными ОС 
:(
    Опции темы
Proger10
Дата 9.7.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста чтиво какое-нибудь (желательно с примерами), где можно почерпнуть информацию об организации работы с потоками. Код должен работать под Linux и Windows. Если будет и MacOS - будет вообще предел блаженства. smile

Задача простейшая. Есть два "вечных" цикла, которые должны работать одновременно. Изредка перебрасывая какую-либо информацию через общие переменные. Пока что у меня получается только два цикла по очереди, либо две запущенных проги одновременно smile что не канает, естественно.

Компилятор: GCC.

Это сообщение отредактировал(а) Proger10 - 9.7.2009, 23:57
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Походу прямая мне дорога к Boost'у. Не подскажите ли, как с ним скомпилить прогу? smile

Компилить пытался так:
Код
$ g++ main.cpp -lglut -I/usr/include/boost-1_37/ `pkg-config opencv --cflags --libs`
/tmp/ccwcvgMr.o: In function `main':                                                                                
main.cpp:(.text+0x11e): undefined reference to `boost::thread::join()'                                              
main.cpp:(.text+0x12c): undefined reference to `boost::thread::~thread()'                                           
main.cpp:(.text+0x14b): undefined reference to `boost::thread::~thread()'                                           
/tmp/ccwcvgMr.o: In function `boost::mutex::mutex()':                                                               
main.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x42): undefined reference to `boost::thread_resource_error::thread_resource_error()'                                                                                                                  
main.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x47): undefined reference to `boost::thread_resource_error::~thread_resource_error()'                                                                                                                 
main.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x4c): undefined reference to `typeinfo for boost::thread_resource_error'
...и так далее....

кстати, путь верный:
$ ls /usr/include/boost-1_37/
boost
$

(у меня GLut приложение)

Пример взял отсюда: http://ru.wikipedia.org/wiki/Boost_(библиотека) 
(самый последний про треды)

И вот чего-то не компилится оно...
PM MAIL   Вверх
vinick
Дата 10.7.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(Proger10 @  10.7.2009,  00:15 Найти цитируемый пост)
Походу прямая мне дорога к Boost'у. Не подскажите ли, как с ним скомпилить прогу?

Код

$ g++ main.cpp -lglut -I/usr/include/boost-1_37/ `pkg-config opencv --cflags --libs` -lboost_thread


либо -lboost_thread-mt

PM MAIL ICQ Jabber   Вверх
Proger10
Дата 10.7.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



О, действительно, так компилируется успешно! Спасибо!
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



У меня тут некоторая проблема возникла.. Понимаю, что это уже оффтопик по отношению к этой теме, но всё же - может кто смекнёт в чём проблема..

Вот мой код: http://paste.org.ru/?iqkord
Команда сборки: g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
Требует: OpenCV, OpenGL, GLut, Boost

Идея такая. Запускаю два окна в разных потоках. Одно окно - вечный цикл получающий изображение с вебкамеры, другое окно - это glutMainLoop, которая чего-то там лупит smile
Фишка в том, что после cvWaitKey( 0 ) - это ожидание клика, - стартует drawScene(), на которой происходит "segmentation fault" (что в переводе на язык Windows: программа выполнила недопустимую ошибку и будет закрыта smile ).
Почему у меня отрубилась возможность доступа к opengl?
Без потоков - оба кода рабочие. Только выполняться они должны параллельно, взаимодействуя вот так друг с другом.. "Вот так" это - получаем кадр, чего-нибудь нарисуем через OpenGL, получаем ещё кадр - ещё рисуем.. Но пока что не получается даже и этого :(

Есть предположение, что можно попытаться выделить всё, что связано с OpenGL в отдельный класс. Потом создать экземпляр этого класса и вызывать уже не drawScene, а "myClass.drawScene();". Только вот как бустом запустить в отдельном потоке экземпляр класса? Или такое нельзя сделать?

Это сообщение отредактировал(а) Proger10 - 10.7.2009, 02:30
PM MAIL   Вверх
vinick
Дата 10.7.2009, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(Proger10 @  10.7.2009,  01:32 Найти цитируемый пост)
"segmentation fault" (что в переводе на язык Windows: программа выполнила недопустимую ошибку и будет закрыта smile ).

segmentation fault - это не просто недопустимая ошибка. это ошибка вызванная обращением к запретной области памяти.  Явных проблем в коде я не вижу, но drawScene вызывается из обоих потоков и не защищена мьютексом. Скорее всего проблема в этом. Если ты работаешь в Linux попробуй запустить программу под valgrind, он ловит проблемы с памятью.
PM MAIL ICQ Jabber   Вверх
andrew_121
Дата 10.7.2009, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Proger10, Да, и strace не забудь. И лог покажи.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(vinick @ 10.7.2009,  02:45)
но drawScene вызывается из обоих потоков и не защищена мьютексом. Скорее всего проблема в этом.

Хочу попробовать использовать вот такой пример мьютекса: http://www.ddj.com/showArticle.jhtml?docum...empf&pgno=4
Но куда вставлять эту строчку "boost::mutex::scoped_lock lock(io_mutex);"? smile
В начало drawScene функции и куда-то ещё?

Изменил код на такой: http://paste.org.ru/?f1et0d
Пока что, всё тоже самое осталось :(

Сейчас буду тестить различными дебаггерами.

Добавлено @ 13:23
valgrind после запуска моей проги выдаёт вот это: http://pastebin.ca/1490567
strace после запуска моего кода выдаёт только: "<unfinished ...> \n +++ killed by SIGSEGV +++"


Это сообщение отредактировал(а) Proger10 - 10.7.2009, 13:26
PM MAIL   Вверх
andrew_121
Дата 10.7.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Proger10
В твоем коде:
Цитата

int argc; char** argv; // заглушка (не смог передать эти параметры сюда)

Ты уверен что эту параметры не нужны? Ты их в ноль проинициализируй, передаешь их функции хз* что)

И для чего:
Цитата

initOpenCVWindow();

Перед возвратом из мэин?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



andrew_121, тьфу.. по поводу ещё одной initOpenCVWindow - ошибся. Ну до той строки выполнение всё равно и не дойдёт никогда smile

Я изменил на такое:
Код
int argc = 0; char** argv; // заглушка (т.к. не смог передать эти параметры сюда из мэйна)
glutInit( &argc, argv );

но от этого лучше не стало. Да они и так пустые эти argv. Я ничего не передаю в параметрах.
Тем более что в начале линия отрисовывается через OpenGL. А вот после нажатия любой кнопки (для дальнейшей отрисовки на opengl) - сегментэйшн фолт..

Так как в начале отрисовывается и в OpenGL окно, и в OpenCV - можно подумать, что всё прекрасно инициализировано. А вот дальше с доступом какие-то конкретные проблемы..

Это сообщение отредактировал(а) Proger10 - 10.7.2009, 14:00
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Кстати, с закомментированной drawScene - кадры получаем отлично. Т.е. с OpenCV всё впорядке. Что-то с OpenGL переменными...
Может оно вообще drawScene не видит?
PM MAIL   Вверх
MTWizard
Дата 10.7.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: 3
Всего: 4



Код

void initGlutWindow(int argc, char** argv)
...
boost::thread my_thread2( boost::bind(&initGlutWindow, argc, argv) );

И убери заглушки. boost::bind подключается в <boost/bind.hpp> или <boost/function.hpp>

PM MAIL   Вверх
Proger10
Дата 10.7.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(MTWizard @ 10.7.2009,  14:32)
Код

void initGlutWindow(int argc, char** argv)
...
boost::thread my_thread2( boost::bind(&initGlutWindow, argc, argv) );

И убери заглушки. boost::bind подключается в <boost/bind.hpp> или <boost/function.hpp>

А.. спасибо. Понял.

Только ситуацию, это естественно, так и не поправило.. Первый раз в OpenGL отрисовывается, а второй раз уже нет (второй - из потока). Не с инициализацией тут проблемы. С последующим доступом..
PM MAIL   Вверх
vinick
Дата 10.7.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(Proger10 @  10.7.2009,  01:32 Найти цитируемый пост)
Есть предположение, что можно попытаться выделить всё, что связано с OpenGL в отдельный класс. Потом создать экземпляр этого класса и вызывать уже не drawScene, а "myClass.drawScene();". Только вот как бустом запустить в отдельном потоке экземпляр класса? Или такое нельзя сделать?

Можно при помощи boost::bind
Код

class Myclass
{
   public:
      void drawScene() {}
};
int main()
{
     MyClass *c = new MyClass;
     boost::thread t(boost::bind(&Myclass::drawScene,c));
}


Цитата

#
==3476== Invalid read of size 8                                                                                                 
#
==3476==    at 0x6C55209: (within /usr/lib64/opengl/nvidia/lib/libGL.so.185.18.14)                                               
#
==3476==    by 0x4022CE: initOpenCVWindow() (in /home/denis/secondlab/testes/computer-vision/tracking-color-drawing/a.out)   

Valgrind говорит что у тебя было обращение к не инициализированной памяти, при вызове openGL функции откуда-то из initOpenCVWindow.
Добавь при компиляции -g -O0, тогда в выхлопе valgrind будут номера строк и сможешь увидеть в каком конккретно вызове процесс упал.


PM MAIL ICQ Jabber   Вверх
Proger10
Дата 10.7.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Что-то не особо заметны номера строк.. smile http://pastebin.ca/1490636

В отдельный класс попытаюсь сейчас выделить OpenGL функции..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1421 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.