Решение проблемы: OpenCV, обработка событий оконной системы и файловые дескрипторы (комментарий)
Привет всем!
Сразу говорю, хочется достаточно странного. Собственно в тегах это и указано.
Пишу на Python небольшую софтинку с использованием OpenCV. Кроме обработки изображений OpenCV используется и для GUI. Это удобно, особенно в процессе отладки, т.к. не возникает необходимости в дополнительных манипуляциях с картинкой перед отображением, а можно просто показать с помощью cv2.imshow()
.
Да, я знаю, что модуль High-level GUI не предназначен для сложных интерфейсов и об этом прямо говорится в документации.
Проблема в том, что для работы GUI из OpenCV надо периодически дёргать cv2.waitKey()
. Обычно это делается в цикле while True:
. Но у меня есть другие источники событий, работа с которыми осуществляется через файловые дескрипторы. Т.е. цикл обработки событий через select / poll / epoll
. Логичным было бы файловый дескриптор от unix-сокета, соответствующего подключению к X11-серверу добавить в этот цикл обработки событий и cv2.waitKey()
вызывать только тогда, когда там есть данные, а не по таймауту или в цикле while True:
.
Возникает вопрос. Как узнать номер нужного файлового дескриптора?
Есть посмотреть содержимое /proc/self/fd/
, то там явно есть нужный дескриптор:
0 -> /dev/pts/1
1 -> /dev/pts/1
2 -> /dev/pts/1
3 -> anon_inode:[eventfd]
4 -> pipe:[576490]
5 -> pipe:[576490]
6 -> socket:[576491]
7 -> socket:[576492]
Дескрипторы с номером больше 2 открываются после вызова cv2.namedWindow()
.
Как узнать, какой из них какой?
Как вообще в общем случае узнать какому объекту файловой системы соответствует ссылка вида socket:[number]
в /proc/self/fd/
?