Russian Qt Forum
Ноябрь 24, 2024, 01:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
qt4: linux + QThread
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: qt4: linux + QThread (Прочитано 7731 раз)
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
:
Май 29, 2006, 18:05 »
Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать!
Где может быть косяк, может при сборке накосячил?
Записан
Sergeich
Гость
qt4: linux + QThread
«
Ответ #1 :
Май 29, 2006, 23:33 »
Ты как с камерами общаешься? Может там из нескольких потоков сразу нельзя? Видео как рисуешь? Как из потоков от камер в главный поток картинки передаешь? Qt какая
? Поподробнее. Я не телепат.
Записан
alex0303
Гость
qt4: linux + QThread
«
Ответ #2 :
Май 30, 2006, 08:46 »
В плюс к вопросам Sergeich-а.
Может не успевает выгребать/отрисовывать первый канал, потому до второго дело не доходит.
В 3-ей qt я наблюдал такую картину что большая картинка перерисовывается намного дольше чем например вдвое (по каждой оси) прореженнае. При этом скорость отличалась не в 4 раза, а раз в 10 минимум.
Точно не помню, но по моему тормозило конвертирование QImage в QPixmap.
Под линуксом с девайсами клёво и в одном потоке работать с помощью QSocketNotifier (если драйвер девайса poll/select поддерживает).
Ну и конечно если машинка не SMP.
Записан
Maxz
Гость
Re: qt4: linux + QThread
«
Ответ #3 :
Май 30, 2006, 09:02 »
Цитата: "Admin"
Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать!
Может, я не совсем прав, но вроде бы в Линухе несколько иначе организована многопоточность, нежели в Виндах. Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. А т.к. эти потоки полностью равнозначны, м.б. проблема в этом, т.е. надо уже в коде самих потоков ставить принудительное "засыпание", чтобы другой смог отработать?
Записан
alex0303
Гость
Re: qt4: linux + QThread
«
Ответ #4 :
Май 30, 2006, 09:41 »
Цитата: "Maxz"
... Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. ...
В линуксе вытесняющая многозадачность ничуть не хуже виндовой.
Записан
Maxz
Гость
Re: qt4: linux + QThread
«
Ответ #5 :
Май 30, 2006, 10:01 »
Цитата: "alex0303"
В линуксе вытесняющая многозадачность ничуть не хуже виндовой.
Я не сравниваю, что лучше или хуже, просто написал об этом как об одной из причин (на мой взгляд) возникновения этой проблемы. Не факт, что именно от этого, но и такой вариант тоже надо рассмотреть...
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
Ответ #6 :
Май 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 командой шаманить!
Записан
alex0303
Гость
qt4: linux + QThread
«
Ответ #7 :
Май 30, 2006, 11:44 »
А либа чья? Глобальных переменных там нет? Т.е. позволяет ли работать с 2-мя девайсами?
Блокирующий (т.е. с ожиданием) read() в отдельном потоке ничего в остальных потоках блокировать не должен.
Один read() может блокировать другой если драйвер кривовато написан, он же (драйвер) один? Кстати что за девайсы и драйвера?
Если драйвер поддерживает poll, то я бы на потоках не заморачивался.
Создал бы два QSocketNotifier-а (с QSocketNotifier::Read), подсунул им два фаайловых дескриптора девайсов, и по сигналу activated() вызывал бы чтение кадра из либы.
Впрочем можно и с потоками, но добавляется межпоточное взаимодействие.
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
Ответ #8 :
Май 30, 2006, 21:29 »
как я понял работа с камерами идет через read или mmap.
Наш программер не реализовал mmap.
Были испробованы популярные программы:
mplayer - глючит при 2 камерах
xawtv тоже
camstream аналогично
помогла только cam??? - уже не помню
добавлено спустя 1 минуту:
Цитировать
alex0303
девайсы v4l /dev/video и дальше
подключены USB камеры фирмы Logitech!
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
Ответ #9 :
Май 31, 2006, 17:14 »
проблема оказалась в следующем!
2 камеры не могут в linux работать одновременно в разных разрешениях!
вот отсюда и был зависон!
Записан
alex0303
Гость
qt4: linux + QThread
«
Ответ #10 :
Май 31, 2006, 20:40 »
Цитата: "Admin"
проблема оказалась в следующем!
2 камеры не могут в linux работать одновременно в разных разрешениях!
вот отсюда и был зависон!
Я бы сказал что не в линуксе, а в конкретной реализации video for linux, а то и (скорее) в более нижнем драйвере Вашего девайса.
Кстати v4l первый или второй?
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
Ответ #11 :
Май 31, 2006, 21:50 »
я не знаю!
ядро 2.4.12 кажется
Debian Sarge!
Записан
alex0303
Гость
qt4: linux + QThread
«
Ответ #12 :
Июнь 01, 2006, 08:21 »
Ядро довольно старое (даже для линейки 2.4.х), видимо и драйвера такие-же.
Тогда по моему v4l-2 еще не было (в дистрибутивах).
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
qt4: linux + QThread
«
Ответ #13 :
Июнь 01, 2006, 10:41 »
уточнил ядро 2.4.27
а сменить его возможности нет! отвалятся некоторые драйвера для камер!
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...