Модераторы: 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   Вверх
Proger10
Дата 10.7.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



vinick, не пойму с классом.. http://paste.org.ru/?96j7qg - оно мне выдаёт на компайле:
Код
$ g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
main.cpp: In member function 'void OpenGLClass::initGlutWindow()':
main.cpp:83: error: argument of type 'void (OpenGLClass::)()' does not match 'void (*)()'
main.cpp:84: error: argument of type 'void (OpenGLClass::)(unsigned char, int, int)' does not match 'void (*)(unsigned char, int, int)'
main.cpp:85: error: argument of type 'void (OpenGLClass::)(int, int)' does not match 'void (*)(int, int)'
main.cpp: In function 'int main(int, char**)':
main.cpp:119: error: 'OpenGL' has not been declared
make: *** [all] Error 1


Добавлено через 3 минуты и 40 секунд
Упс, там про ошибку на 119 строке, ессно так: boost::thread myThread1( boost::bind( &OpenGLClass::initGlutWindow, c ) );

Ну да всё равно. К чему мы передаём в функцию initGlutWindow параметр экземпляра класса? Это точно верная форма вызова?? Очень подозрительная форма вызова: "OpenGLClass::initGlutWindow" smile
PM MAIL   Вверх
AlexT84
Дата 10.7.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(vinick @ 10.7.2009,  14:49)
Можно при помощи boost::bind

Можно и без бинда
Код

class Myclass
{
   public:
      void drawScene() {}
      void operator ()(void)
      {
           drawScene();
      }
};
int main()
{
     MyClass c;
     boost::thread t(c);
}


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


Опытный
**


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

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



Цитата(Proger10 @  10.7.2009,  15:24 Найти цитируемый пост)
Что-то не особо заметны номера строк.. smile http://pastebin.ca/1490636

Заметны
Цитата

#
==21878== Invalid read of size 8
#
==21878==    at 0x6C55209: (within /usr/lib64/opengl/nvidia/lib/libGL.so.185.18.14)
#
==21878==    by 0x402425: initOpenCVWindow() (main.cpp:101)  <-------------------


Добавлено через 4 минуты и 22 секунды
Цитата(Proger10 @  10.7.2009,  15:41 Найти цитируемый пост)
Ну да всё равно. К чему мы передаём в функцию initGlutWindow параметр экземпляра класса? Это точно верная форма вызова?? Очень подозрительная форма вызова: "OpenGLClass::initGlutWindow" smile 

Это верная форма вызова. Ругается у тебя по другой причине, я так понял что ты ее уже исправил.

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


Опытный
**


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

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



AlexT84, попытался сделать: http://paste.org.ru/?3e2azl
и вот:
Код
$ g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
main.cpp:82: error: expected unqualified-id before '{' token
main.cpp:98: error: 'void OpenGLClass::operator()()' cannot be overloaded
main.cpp:74: error: with 'void OpenGLClass::operator()()'
main.cpp: In function 'int main(int, char**)':
main.cpp:136: error: 'c' is not a class or namespace
make: *** [all] Error 1

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


Опытный
**


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

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



---

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


Опытный
**


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

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



Код

 boost::thread myThread1( boost::bind( &c::drawScene() ) );

замени на 
Код

boost::thread myThread1( с );

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


Новичок



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

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



Быть может, это потому, что у тебя operator () два раза определён. На 74 и 98 строке. Да, кстати, если хочеш работать с потоками, вынеси  OpenGLClass c; из main, либо сделай его динамическим.
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://paste.org.ru/?frnwfq
Код
$ g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
main.cpp:128: error: stray '\361' in program
main.cpp:22: error: 'OpenGLClass' does not name a type
main.cpp:78: error: expected unqualified-id before '{' token
main.cpp: In function 'int main(int, char**)':
main.cpp:137: error: request for member 'join' in 'myThread1', which is of non-class type 'boost::thread ()()'
make: *** [all] Error 1

никак не угадаю где ошибка..
PM MAIL   Вверх
DRUID3
Дата 10.7.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Походу прямая мне дорога к Boost'у.

Тупо для инфы - еще можно и через Qt4...


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
AlexT84
Дата 10.7.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



22 строка -- объявление объекта до описания класса
78 строка -- OpenGLClass {   конструктор объявляется OpenGLClass() {
остальные скорее всего производные.
PM MAIL   Вверх
MTWizard
Дата 10.7.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У тебя чистой воды гонка: ты запускаешь одновременно инициализацию openCV и openGL в разніх потоках. Если инициализация openCV отработает раньше, то она вызовет функции openGL в тот момент, когда openGL ещё недоинициализирована. Так что окончания инициализации надо дождаться и только потом запускать рисование
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то не получается.. а что за ошибка на 128?
http://paste.org.ru/?f2udwb
Код
$ g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
main.cpp:128: error: stray '\361' in program
main.cpp: In constructor 'OpenGLClass::OpenGLClass()':
main.cpp:84: error: argument of type 'void (OpenGLClass::)()' does not match 'void (*)()'
main.cpp:85: error: argument of type 'void (OpenGLClass::)(unsigned char, int, int)' does not match 'void (*)(unsigned char, int, int)'
main.cpp:86: error: argument of type 'void (OpenGLClass::)(int, int)' does not match 'void (*)(int, int)'
main.cpp: In function 'int main(int, char**)':
main.cpp:137: error: request for member 'join' in 'myThread1', which is of non-class type 'boost::thread ()()'
make: *** [all] Error 1

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


Новичок



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

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



На 128й строке у тебя скорее всего закрался посторонний символ, когда ты копипастил код с форума. Попробуй удалить её и перепечатать руками.
На 84, 85, 86 передаёш методы класса как статические функции.
на 137 должно быть производная от 128й.


В общем доведи свой код, до состояния, когда он скомпилится без потоков. Потом и можно будет разбиратся.

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


Кодофей
****


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

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



Цитата(DRUID3 @  10.7.2009,  16:58 Найти цитируемый пост)
Тупо для инфы - еще можно и через Qt4... 

Используй libpthread. Она на многие ОС портирована.
OpenGLClass создай динамически.


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


Опытный
**


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

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



Цитата(MTWizard @ 10.7.2009,  17:15)
У тебя чистой воды гонка: ты запускаешь одновременно инициализацию openCV и openGL в разніх потоках. Если инициализация openCV отработает раньше, то она вызовет функции openGL в тот момент, когда openGL ещё недоинициализирована. Так что окончания инициализации надо дождаться и только потом запускать рисование

Нее.. погоди, вот с этим я не согласен. Я говорил, что у меня на OpenGL уже отрисовывается(!) первый раз.. А после клика на кнопку там вызывается второй раз drawScene - и вот тогда вылетает.
Почему же мы делаем вывод, что оно не инициализируется, если оно даже отрисовывает первый раз линию успешно? А вот второй раз после cvWaitKey улетает..
PM MAIL   Вверх
Lazin
Дата 10.7.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(andrew_121 @  10.7.2009,  17:40 Найти цитируемый пост)
OpenGLClass создай динамически

зачем?
Цитата(andrew_121 @  10.7.2009,  17:40 Найти цитируемый пост)
Используй libpthread

зачем?
PM MAIL Skype GTalk   Вверх
Proger10
Дата 10.7.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А я кстати не понял зачем мне Qt4 предлагают smile Я её потихоньку начинал осваивать, правда в этом проекте не использую.
Пытаюсь вот бустом запустить.. Хотя пока что и без буста класс не работает smile

Добавлено через 1 минуту и 39 секунд
Я вот знаете что не пойму..
У меня вот так объявлено:

Код
int main( int argc, char** argv ) {

    OpenGLClass openGLClass;

    openGLClass::drawScene();

}

почему оно мне выдаёт такую ошибку?
Код
main.cpp:126: error: 'openGLClass' is not a class or namespace


Добавлено через 5 минут и 31 секунду
Я пытаюсь пока запустить класс без бустов и тут даже не выходит.. у меня сейчас код в таком состоянии: http://paste.org.ru/?43huh7
Код
$g++ main.cpp -lglut -lboost_thread-mt `pkg-config opencv --cflags --libs`
main.cpp: In constructor 'OpenGLClass::OpenGLClass()':
main.cpp:84: error: argument of type 'void (OpenGLClass::)()' does not match 'void (*)()'
main.cpp:85: error: argument of type 'void (OpenGLClass::)(unsigned char, int, int)' does not match 'void (*)(unsigned char, int, int)'
main.cpp:86: error: argument of type 'void (OpenGLClass::)(int, int)' does not match 'void (*)(int, int)'
main.cpp: In function 'int main(int, char**)':
main.cpp:126: error: 'openGLClass' is not a class or namespace
make: *** [all] Error 1

не подскажите ли, чего сейчас тут не так?

Добавлено через 7 минут и 2 секунды
Причём тут вообще строчки 84-86?? они вот:
-----------------------------------
glLoadIdentity();

glBegin( GL_LINES );
-----------------------------------
и что в них не так? smile

Добавлено через 12 минут и 58 секунд
Там кстати была строчка в drawScene:
boost::mutex::scoped_lock lock( io_mutex );
я её закомментил. Терь также ругается на другие строчки smile
Код
main.cpp: In constructor 'OpenGLClass::OpenGLClass()':
main.cpp:36: error: argument of type 'void (OpenGLClass::)()' does not match 'void (*)()'
main.cpp:37: error: argument of type 'void (OpenGLClass::)(unsigned char, int, int)' does not match 'void (*)(unsigned char, int, int)'
main.cpp:38: error: argument of type 'void (OpenGLClass::)(int, int)' does not match 'void (*)(int, int)'
main.cpp: In function 'int main(int, char**)':
main.cpp:124: error: 'openGLClass' is not a class or namespace
make: *** [all] Error 1

пом оно определиться не может с ошибкой...
PM MAIL   Вверх
vinick
Дата 10.7.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Proger10,  в твоем коде.
Код

  glutDisplayFunc( drawScene );

drawScene не статическая функция, нельзя ее туда передавать.

Код

 openGLClass::drawScene();


Ну тут совсем неправильно, если drawScene объявить статической, то вызывать ее надо
Код

OpenGLClass::drawScene();

если не объявлять, то
Код

openGLClass.drawScene();


Вывод: объяви drawScene как статическую. 

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


Опытный
**


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

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



Понятно. Спасибо! Терь скомпилировалось smile
Объявил статисческими и handleResize, и handleKeypress..

Терь попробую с потоками..

Добавлено через 52 секунды
Кстати, у меня наоборот - сейчас функция drawScene статическая и вызвать можно только так: openGLClass.drawScene();
через двоеточие - ругается.
PM MAIL   Вверх
andrew_121
Дата 10.7.2009, 19:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Lazin, Просто ждал от вас этого вопроса smile 
Кроме "вопросов", по теме что-то полезное сообщите?

Это сообщение отредактировал(а) andrew_121 - 10.7.2009, 19:15


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


Опытный
**


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

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



Цитата(Proger10 @  10.7.2009,  18:55 Найти цитируемый пост)
Кстати, у меня наоборот - сейчас функция drawScene статическая и вызвать можно только так: openGLClass.drawScene();
через двоеточие - ругается. 

Если двоеточия, то надо использовать имя класса а не имя объекта.
Я настойчиво рекомендую почитать книжку по языку. Потому как то, что ты сотворил с классами - мягко говоря бред.  
PM MAIL ICQ Jabber   Вверх
Proger10
Дата 10.7.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Омг ёмаё!!! Следующая проблема..

Как мне объявить:
MyOpenGLClass openGLClass;
так, чтобы она была видна из openCV?
При инициализации в openGLClass (в конструктуре) есть glutMainLoop - это глутовский вечный цикл... дальше код не идёт на выполнение smile

Добавлено через 4 минуты и 21 секунду
vinick, понимаю, что бред. Мне хочется просто заставить её работать. Хоть как.. потом я уже красоту наведу. Я же решения ещё не нашёл даже..
PM MAIL   Вверх
vinick
Дата 10.7.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Proger10 @  10.7.2009,  19:13 Найти цитируемый пост)
Омг ёмаё!!! Следующая проблема..

Вернись к варианту без классов, пока у тебя не общих данных, они тут нафиг не нужны. А то ты еще больше запутаешься. Найди место в коде где вылетает SIGSEGV, а потом уже отладчиком или отладочной печатью выясни почему это происходит.
PM MAIL ICQ Jabber   Вверх
Proger10
Дата 10.7.2009, 19:24 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот дерьмо.. снова segmentation fault.
Привёл код в чувство: http://paste.org.ru/?orggqz
Но после первого нажатия клавиши, сука, вылетает... Уж зла нет.

Добавлено через 1 минуту и 41 секунду
Цитата(vinick @ 10.7.2009,  19:23)
Цитата(Proger10 @  10.7.2009,  19:13 Найти цитируемый пост)
Омг ёмаё!!! Следующая проблема..

Вернись к варианту без классов, пока у тебя не общих данных, они тут нафиг не нужны. А то ты еще больше запутаешься. Найди место в коде где вылетает SIGSEGV, а потом уже отладчиком или отладочной печатью выясни почему это происходит.

Так в том-то и дело, что не понятно. Почему-то уходит доступ к OpenGL. Почему - фиг его знает.. Причём первый раз drawScene срабатывает, а на второй раз drawScene - вылетает.

В классы я захотел выделить в надежде, что выделятся все переменные в одно место и там не будет таких ошибок... а фиг тут..

Добавлено через 3 минуты и 18 секунд
Тут ведь видите.. код простейший. Тут ошибок быть не может.. Ну.. образно smile
Мне кажется проблема в технологии распараллеливания.. Именна она делает невозможным доступ к opengl... мне так кажется.
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



То есть по сути я хочу сделать вечный цикл в котором отрисовывать в OpenGL.. больше ничего.

Добавлено через 6 минут и 51 секунду
только проблема в том, что для того, чтобы глут инициализировать нужно запустить glutMainLoop, который по сути вечный цикл и управление до моего кода не дойдёт, если поточить не буду эти два цикла (мой и glutMainLoop).
PM MAIL   Вверх
Lazin
Дата 10.7.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(andrew_121 @  10.7.2009,  19:03 Найти цитируемый пост)
Lazin, Просто ждал от вас этого вопроса  
Кроме "вопросов", по теме что-то полезное сообщите?


Цитата(Lazin @  10.7.2009,  17:50 Найти цитируемый пост)
OpenGLClass создай динамически

зачем? подозреваю, что в целях обфускации кода, но не уверен... может просветите, откуда такая необходимость? smile 

Цитата(Lazin @  10.7.2009,  17:50 Найти цитируемый пост)
Используй libpthread

зачем? boost.thread на порядок проще чем pthread, ТС все еще не может скомпилировать свой код, а ты ему предлагаешь использовать pthread? smile

Добавлено через 1 минуту и 32 секунды
а glut threadsafe?
PM MAIL Skype GTalk   Вверх
Proger10
Дата 10.7.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не правда! Я уже скомпилил его! Один хрен - не идёт smile я уж и так, и сяк...
PM MAIL   Вверх
Lazin
Дата 10.7.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Proger10, начни последовательной программы, добейся того, что-бы твой код был прост и понятен, и самое главное - работал, а потом думай, что и как там можно распараллелить smile 
PM MAIL Skype GTalk   Вверх
Proger10
Дата 10.7.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну так.. отдельные части работают отлично!
Т.е. opencv окно работает превосходно. И glut работает также превосходно.
Когда у меня возникает цикл (в opencv) (предположим что это просто пустой цикл) почему-то drawScene отваливается.
Lazin, чем плох этот код? http://paste.org.ru/?iqkord Прост.. но не работает ведь!
PM MAIL   Вверх
Proger10
Дата 10.7.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати, а нет ли тут людей соображающих в GLut? Походу в ней проблема.. нельзя ли убрать glutMainLoop? Всмысле, чтобы при этом осталась работоспособсность проекта smile
PM MAIL   Вверх
zim22
Дата 10.7.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Proger10 @  10.7.2009,  21:12 Найти цитируемый пост)
а нет ли тут людей соображающих в GLut? Походу в ней проблема

ну конечно в ней. если ваш код не работает - то виновата библиотека/компилятор  smile 


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


Опытный
**


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

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



Цитата(zim22 @ 10.7.2009,  21:26)
Цитата(Proger10 @  10.7.2009,  21:12 Найти цитируемый пост)
а нет ли тут людей соображающих в GLut? Походу в ней проблема

ну конечно в ней. если ваш код не работает - то виновата библиотека/компилятор  smile

хахаха  smile  smile 
не, я серьёзно! smile я как заискал сейчас гуглом различные проблемы с этой функой.. В общем походу кадр нужно текстурировать и выводить прямо в нарисованный объект OpenGL..

Добавлено через 6 минут и 29 секунд
Вот такой рабочий код: http://n2.nabble.com/show-webcam-in-OpenGL-td3091448.html
он же: http://paste.org.ru/?8cv3zk
Но ёлки палки.. 800 строк только для получения кадра и рисования двух палочек на экране??
PM MAIL   Вверх
zim22
Дата 10.7.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Proger10 @  10.7.2009,  21:35 Найти цитируемый пост)
В общем походу кадр нужно текстурировать и выводить прямо в нарисованный объект OpenGL..

вы не пробовали в соотв.теме спросить?
C/C++: Мультимедия, OpenGL/DirectX


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


Опытный
**


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

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



Дык зачем спрашивать если уже есть решение smile
Кстати, вот текстуирование: http://paste.org.ru/?k51xks
Будете смеяться, но проблема с неизвестно-куда-пиханием цикла по получению кадров осталась smile

Добавлено через 2 минуты и 52 секунды
Аааа... понял! Вот ответ: glutIdleFunc(display);
во время idle (простаивания) будет вызываться постоянно функция display - ну здесь и можно ретривить по кадру с камеры. Походу... проблема решена smile тьфу тьфу как бы не сглазить smile
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.1642 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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