Название: qt4: linux + QThread Отправлено: Admin от Май 29, 2006, 18:05 Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать!
Где может быть косяк, может при сборке накосячил? Название: qt4: linux + QThread Отправлено: Sergeich от Май 29, 2006, 23:33 Ты как с камерами общаешься? Может там из нескольких потоков сразу нельзя? Видео как рисуешь? Как из потоков от камер в главный поток картинки передаешь? Qt какая :D ? Поподробнее. Я не телепат.
Название: qt4: linux + QThread Отправлено: alex0303 от Май 30, 2006, 08:46 В плюс к вопросам Sergeich-а.
Может не успевает выгребать/отрисовывать первый канал, потому до второго дело не доходит. :) В 3-ей qt я наблюдал такую картину что большая картинка перерисовывается намного дольше чем например вдвое (по каждой оси) прореженнае. При этом скорость отличалась не в 4 раза, а раз в 10 минимум. :( Точно не помню, но по моему тормозило конвертирование QImage в QPixmap. Под линуксом с девайсами клёво и в одном потоке работать с помощью QSocketNotifier (если драйвер девайса poll/select поддерживает). Ну и конечно если машинка не SMP. :) Название: Re: qt4: linux + QThread Отправлено: Maxz от Май 30, 2006, 09:02 Цитата: "Admin" Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать! Может, я не совсем прав, но вроде бы в Линухе несколько иначе организована многопоточность, нежели в Виндах. Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. А т.к. эти потоки полностью равнозначны, м.б. проблема в этом, т.е. надо уже в коде самих потоков ставить принудительное "засыпание", чтобы другой смог отработать? Название: Re: qt4: linux + QThread Отправлено: alex0303 от Май 30, 2006, 09:41 Цитата: "Maxz" ... Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. ... В линуксе вытесняющая многозадачность ничуть не хуже виндовой. Название: Re: qt4: linux + QThread Отправлено: Maxz от Май 30, 2006, 10:01 Цитата: "alex0303" В линуксе вытесняющая многозадачность ничуть не хуже виндовой. Я не сравниваю, что лучше или хуже, просто написал об этом как об одной из причин (на мой взгляд) возникновения этой проблемы. Не факт, что именно от этого, но и такой вариант тоже надо рассмотреть... Название: qt4: linux + QThread Отправлено: Admin от Май 30, 2006, 11:27 Давайет тогда поподробнее
1. Есть 2 lib.so, одинаковые одна с помощью read читает из /dev/video0, вторая /dev/video1 2. есть программа которая загружает so и атачит их к устройствам 3. на каждое утройство создается 1 тред, в котором произходит чтение картинки и конвертация ее в QImage 4. Потом из каждого треда посылается QEvent на то что картинка изменилась. Подобная схема работает в Windows, но не работает в Linux. Причем, при прибитии 1 треда, начинает работать второй, такое ощущение что программа однотредовая. PS: в windows qt4.1, а в линуксе qt4.0 добавлено спустя 12 минут: Путем уборки функции чтения с камеры, выяслилось что виновата именно она. Возникло тогда 2 предположения: 1. что нибуть с двойной загрузкой одной и тойже so, но на разные девайсы. 2. или read чтонибуть блокирует - хотя это странно. добавлено спустя 47 минут: похоже проблема в том, что read из камеры был блокирующим! как сделать правильное чтение и неблокирующее я пока не понял! надо с poll командой шаманить! Название: qt4: linux + QThread Отправлено: alex0303 от Май 30, 2006, 11:44 А либа чья? Глобальных переменных там нет? Т.е. позволяет ли работать с 2-мя девайсами?
Блокирующий (т.е. с ожиданием) read() в отдельном потоке ничего в остальных потоках блокировать не должен. Один read() может блокировать другой если драйвер кривовато написан, он же (драйвер) один? Кстати что за девайсы и драйвера? Если драйвер поддерживает poll, то я бы на потоках не заморачивался. Создал бы два QSocketNotifier-а (с QSocketNotifier::Read), подсунул им два фаайловых дескриптора девайсов, и по сигналу activated() вызывал бы чтение кадра из либы. Впрочем можно и с потоками, но добавляется межпоточное взаимодействие. Название: qt4: linux + QThread Отправлено: Admin от Май 30, 2006, 21:29 как я понял работа с камерами идет через read или mmap.
Наш программер не реализовал mmap. Были испробованы популярные программы: mplayer - глючит при 2 камерах xawtv тоже camstream аналогично помогла только cam??? - уже не помню :) добавлено спустя 1 минуту: Цитировать alex0303 девайсы v4l /dev/video и дальше подключены USB камеры фирмы Logitech! Название: qt4: linux + QThread Отправлено: Admin от Май 31, 2006, 17:14 проблема оказалась в следующем!
2 камеры не могут в linux работать одновременно в разных разрешениях! вот отсюда и был зависон! Название: qt4: linux + QThread Отправлено: alex0303 от Май 31, 2006, 20:40 Цитата: "Admin" проблема оказалась в следующем! 2 камеры не могут в linux работать одновременно в разных разрешениях! вот отсюда и был зависон! Я бы сказал что не в линуксе, а в конкретной реализации video for linux, а то и (скорее) в более нижнем драйвере Вашего девайса. Кстати v4l первый или второй? Название: qt4: linux + QThread Отправлено: Admin от Май 31, 2006, 21:50 я не знаю!
ядро 2.4.12 кажется Debian Sarge! Название: qt4: linux + QThread Отправлено: alex0303 от Июнь 01, 2006, 08:21 Ядро довольно старое (даже для линейки 2.4.х), видимо и драйвера такие-же.
Тогда по моему v4l-2 еще не было (в дистрибутивах). Название: qt4: linux + QThread Отправлено: Admin от Июнь 01, 2006, 10:41 уточнил ядро 2.4.27
а сменить его возможности нет! отвалятся некоторые драйвера для камер! |