Russian Qt Forum
Ноябрь 24, 2024, 03:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qt4: linux + QThread  (Прочитано 7741 раз)
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« : Май 29, 2006, 18:05 »

Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать!

Где может быть косяк, может при сборке накосячил?
Записан
Sergeich
Гость
« Ответ #1 : Май 29, 2006, 23:33 »

Ты как с камерами общаешься? Может там из нескольких потоков сразу нельзя? Видео как рисуешь? Как из потоков от камер в главный поток картинки передаешь? Qt какая  Веселый ? Поподробнее. Я не телепат.
Записан
alex0303
Гость
« Ответ #2 : Май 30, 2006, 08:46 »

В плюс к вопросам Sergeich-а.

Может не успевает выгребать/отрисовывать первый канал, потому до второго дело не доходит. Улыбающийся
В 3-ей qt я наблюдал такую картину что большая картинка перерисовывается намного дольше чем например вдвое (по каждой оси) прореженнае. При этом скорость отличалась не в 4 раза, а раз в 10 минимум. Грустный
Точно не помню, но по моему тормозило конвертирование QImage в QPixmap.

Под линуксом с девайсами клёво и в одном потоке работать с помощью QSocketNotifier (если драйвер девайса poll/select поддерживает).
Ну и конечно если машинка не SMP. Улыбающийся
Записан
Maxz
Гость
« Ответ #3 : Май 30, 2006, 09:02 »

Цитата: "Admin"
Скомпилил свою программу под Linux. Программа захватывает изображения с 2 камер! Каждая камера это поток! Так вот, работает всегда только один поток, как только его тормозишь начинает второй работать!

Может, я не совсем прав, но вроде бы в Линухе несколько иначе организована многопоточность, нежели в Виндах. Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. А т.к. эти потоки полностью равнозначны, м.б. проблема в этом, т.е. надо уже в коде самих потоков ставить принудительное "засыпание", чтобы другой смог отработать?
Записан
alex0303
Гость
« Ответ #4 : Май 30, 2006, 09:41 »

Цитата: "Maxz"

... Так, в Виндах операционка для каждого отдельного потока выделяет определенный квант времени, т.е. эти 2 потока работают "в параллель", а в Линухе - один поток будет выполняться до тех пор, пока управление не перейдет к потоку с бОльшим приоритетом. ...


В линуксе вытесняющая многозадачность ничуть не хуже виндовой.
Записан
Maxz
Гость
« Ответ #5 : Май 30, 2006, 10:01 »

Цитата: "alex0303"
В линуксе вытесняющая многозадачность ничуть не хуже виндовой.

Я не сравниваю, что лучше или хуже, просто написал об этом как об одной из причин (на мой взгляд) возникновения этой проблемы. Не факт, что именно от этого, но и такой вариант тоже надо рассмотреть...
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #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
Гость
« Ответ #7 : Май 30, 2006, 11:44 »

А либа чья? Глобальных переменных там нет? Т.е. позволяет ли работать с 2-мя девайсами?

Блокирующий (т.е. с ожиданием) read() в отдельном потоке ничего в остальных потоках блокировать не должен.

Один read() может блокировать другой если драйвер кривовато написан, он же (драйвер) один? Кстати что за девайсы и драйвера?

Если драйвер поддерживает poll, то я бы на потоках не заморачивался.
Создал бы  два QSocketNotifier-а (с QSocketNotifier::Read), подсунул им два фаайловых дескриптора  девайсов, и по сигналу activated() вызывал бы чтение кадра из либы.

Впрочем можно и с потоками, но добавляется межпоточное взаимодействие.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #8 : Май 30, 2006, 21:29 »

как я понял работа с камерами идет через read или mmap.

Наш программер не реализовал mmap.

Были испробованы популярные программы:
mplayer - глючит при 2 камерах
xawtv тоже
camstream аналогично

помогла только cam??? - уже не помню Улыбающийся

добавлено спустя 1 минуту:

 
Цитировать

alex0303


девайсы v4l /dev/video и дальше
подключены USB камеры фирмы Logitech!
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #9 : Май 31, 2006, 17:14 »

проблема оказалась в следующем!

2 камеры не могут в linux работать одновременно в разных разрешениях!
вот отсюда и был зависон!
Записан
alex0303
Гость
« Ответ #10 : Май 31, 2006, 20:40 »

Цитата: "Admin"
проблема оказалась в следующем!

2 камеры не могут в linux работать одновременно в разных разрешениях!
вот отсюда и был зависон!


Я бы сказал что не в линуксе, а в конкретной реализации video for linux, а то и (скорее) в более нижнем драйвере Вашего девайса.
Кстати v4l первый или второй?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #11 : Май 31, 2006, 21:50 »

я не знаю!
ядро 2.4.12 кажется
Debian Sarge!
Записан
alex0303
Гость
« Ответ #12 : Июнь 01, 2006, 08:21 »

Ядро довольно старое (даже для линейки 2.4.х), видимо и драйвера такие-же.
Тогда по моему v4l-2 еще не было (в дистрибутивах).
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #13 : Июнь 01, 2006, 10:41 »

уточнил ядро 2.4.27

а сменить его возможности нет! отвалятся некоторые драйвера для камер!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.