Russian Qt Forum

Qt => Общие вопросы => Тема начата: Admin от Май 29, 2006, 18:05



Название: 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

а сменить его возможности нет! отвалятся некоторые драйвера для камер!