![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Подскажите пожалуйста чтиво какое-нибудь (желательно с примерами), где можно почерпнуть информацию об организации работы с потоками. Код должен работать под Linux и Windows. Если будет и MacOS - будет вообще предел блаженства.
![]() Задача простейшая. Есть два "вечных" цикла, которые должны работать одновременно. Изредка перебрасывая какую-либо информацию через общие переменные. Пока что у меня получается только два цикла по очереди, либо две запущенных проги одновременно ![]() Компилятор: GCC. Это сообщение отредактировал(а) Proger10 - 9.7.2009, 23:57 |
|||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Походу прямая мне дорога к Boost'у. Не подскажите ли, как с ним скомпилить прогу?
![]() Компилить пытался так:
(у меня GLut приложение) Пример взял отсюда: http://ru.wikipedia.org/wiki/Boost_(библиотека) (самый последний про треды) И вот чего-то не компилится оно... |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
||||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
О, действительно, так компилируется успешно! Спасибо!
|
|||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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, которая чего-то там лупит ![]() Фишка в том, что после cvWaitKey( 0 ) - это ожидание клика, - стартует drawScene(), на которой происходит "segmentation fault" (что в переводе на язык Windows: программа выполнила недопустимую ошибку и будет закрыта ![]() Почему у меня отрубилась возможность доступа к opengl? Без потоков - оба кода рабочие. Только выполняться они должны параллельно, взаимодействуя вот так друг с другом.. "Вот так" это - получаем кадр, чего-нибудь нарисуем через OpenGL, получаем ещё кадр - ещё рисуем.. Но пока что не получается даже и этого :( Есть предположение, что можно попытаться выделить всё, что связано с OpenGL в отдельный класс. Потом создать экземпляр этого класса и вызывать уже не drawScene, а "myClass.drawScene();". Только вот как бустом запустить в отдельном потоке экземпляр класса? Или такое нельзя сделать? Это сообщение отредактировал(а) Proger10 - 10.7.2009, 02:30 |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
segmentation fault - это не просто недопустимая ошибка. это ошибка вызванная обращением к запретной области памяти. Явных проблем в коде я не вижу, но drawScene вызывается из обоих потоков и не защищена мьютексом. Скорее всего проблема в этом. Если ты работаешь в Linux попробуй запустить программу под valgrind, он ловит проблемы с памятью. |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Proger10, Да, и strace не забудь. И лог покажи.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Хочу попробовать использовать вот такой пример мьютекса: http://www.ddj.com/showArticle.jhtml?docum...empf&pgno=4 Но куда вставлять эту строчку "boost::mutex::scoped_lock lock(io_mutex);"? ![]() В начало 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 |
|||
|
||||
andrew_121 |
|
||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Proger10
В твоем коде:
Ты уверен что эту параметры не нужны? Ты их в ноль проинициализируй, передаешь их функции хз* что) И для чего:
Перед возвратом из мэин? -------------------- Удалил аккаунт. Прощайте! |
||||
|
|||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
andrew_121, тьфу.. по поводу ещё одной initOpenCVWindow - ошибся. Ну до той строки выполнение всё равно и не дойдёт никогда
![]() Я изменил на такое:
но от этого лучше не стало. Да они и так пустые эти argv. Я ничего не передаю в параметрах. Тем более что в начале линия отрисовывается через OpenGL. А вот после нажатия любой кнопки (для дальнейшей отрисовки на opengl) - сегментэйшн фолт.. Так как в начале отрисовывается и в OpenGL окно, и в OpenCV - можно подумать, что всё прекрасно инициализировано. А вот дальше с доступом какие-то конкретные проблемы.. Это сообщение отредактировал(а) Proger10 - 10.7.2009, 14:00 |
|||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Кстати, с закомментированной drawScene - кадры получаем отлично. Т.е. с OpenCV всё впорядке. Что-то с OpenGL переменными...
Может оно вообще drawScene не видит? |
|||
|
||||
MTWizard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: 3 Всего: 4 |
И убери заглушки. boost::bind подключается в <boost/bind.hpp> или <boost/function.hpp> |
|||
|
||||
Proger10 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
А.. спасибо. Понял. Только ситуацию, это естественно, так и не поправило.. Первый раз в OpenGL отрисовывается, а второй раз уже нет (второй - из потока). Не с инициализацией тут проблемы. С последующим доступом.. |
||||
|
|||||
vinick |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
Можно при помощи boost::bind
Valgrind говорит что у тебя было обращение к не инициализированной памяти, при вызове openGL функции откуда-то из initOpenCVWindow. Добавь при компиляции -g -O0, тогда в выхлопе valgrind будут номера строк и сможешь увидеть в каком конккретно вызове процесс упал. |
||||
|
|||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Что-то не особо заметны номера строк..
![]() В отдельный класс попытаюсь сейчас выделить OpenGL функции.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |