Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Апрель 25, 2013, 09:06



Название: Подкиньте идею по остановке главного потока
Отправлено: ecspertiza от Апрель 25, 2013, 09:06
Есть задача записывать видео с экрана пользователя. Есть библиотека которая кодирует видео в нужный формат, но есть проблемы с самим получением картинки. Насколько я понимаю картинку с экрана я могу получить только через QPixmap::grabWindow(). А как мы знаем QPixmap работает только в гуи потоке, стало быть если я буду вызывать QPixmap::grabWindow() в гуи потоке, то приложение у меня просто зависнет. Была идея следующего характера сделать два режима работы приложения в первом отображаем интерфейс во втором просто записываем видео, общение между двумя приложениями сделать через сокеты. Но тогда возникает другая проблема, после посыла сигнала на остановку приложения которое пишет видео, программа ведет себя не однозначно под разными ОС.

В Windows сигнал приходит, while - который производит запись видео останавливается, но что самое интересное кусок кода который находится после while не выполняется, такое ощущение что прога просто останавливает выполнение, хотя должна произвести еще некоторые операции, например запись в файл и прочие. Естественно для остановки while я использую флаг m_stop, что собственно говоря и странно.

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

А в маке вообще все здорово, там и при работе с одним потоком гуи не виснет.

Стало быть, прошу помощи, как в данном случае можно кошерно остановить приложение если gui поток занет снятием картинки с экрана. А может кто то подскажет более верный способ получения изображения с экрана.


Название: Re: Подкиньте идею по остановке главного потока
Отправлено: ecspertiza от Апрель 25, 2013, 11:26
собственно вопрос отпадает, косяк в приложении был.


Название: Re: Подкиньте идею по остановке главного потока
Отправлено: Авварон от Апрель 25, 2013, 11:33
Кажется, в Qt5 всё-таки можно использовать пиксмапы из не-гуи треда (в отличие от виджетов).


Название: Re: Подкиньте идею по остановке главного потока
Отправлено: GreatSnake от Апрель 25, 2013, 11:43
Кажется, в Qt5 всё-таки можно использовать пиксмапы из не-гуи треда (в отличие от виджетов).
Что-то очень сомнительно. Особенно на X-ах. Не перепутал с QImage?


Название: Re: Подкиньте идею по остановке главного потока
Отправлено: ecspertiza от Апрель 25, 2013, 11:57
Насчет 5ого Qt не скажу, но в 4.8.4 например, если дернуть QPixmap::grabWindow не из гуи треда под X`ами софт просто упадет.


Название: Re: Подкиньте идею по остановке главного потока
Отправлено: GreatSnake от Апрель 25, 2013, 12:13
Насчет 5ого Qt не скажу, но в 4.8.4 например, если дернуть QPixmap::grabWindow не из гуи треда под X`ами софт просто упадет.
И правильно сделает, т.к. пиксмап хранится на стороне Xserver-a.
Все работы с пиксмапами и с окнами делаются синхронно через XLib и через X Protocol.
Так что версия Qt значения не имеет.