В Linux может ли процесс визуализировать графический интерфейс другого процесса? - PullRequest
5 голосов
/ 25 октября 2009

Я пишу видеоплеер на Linux, и я хотел бы разделить его на 2 процесса:

A. процесс декодера B. GUI

Таким образом, я мог бы использовать разные языки программирования, и когда возникает проблема, легче понять, в чем проблема.

Проблема в том, может ли A непосредственно обрабатывать декодированные изображения на поверхности B? Я не хочу использовать какой-либо IPC для отправки этих декодированных данных, потому что это может быть очень неэффективно.

Ответы [ 3 ]

8 голосов
/ 25 октября 2009

Можно использовать спецификацию XEmbed , которая позволяет встроить одно окно X11 в другое, и они могут быть из разных процессов. Это то, что обычно делают другие интерфейсы медиаплеера.

И GTK, и Qt поддерживают XEmbed.

4 голосов
/ 25 октября 2009

IPC (особенно канал Unix) гораздо эффективнее, чем вы думаете, и это, вероятно, правильный механизм для использования.

Однако, поскольку вы спросили, как это сделать без IPC (и я понимаю, что это означает без переключения и копирования контекста), вы можете просто создать сегмент общей памяти между двумя процессами:

fd = shm_open("/my_shmem", O_RDWR| O_CREAT, S_IWUSR);
if(fd == -1) abort(); 
ftruncate(fd, SHMEM_SIZE); 
p = mmap(NULL, SHMEM_SIZE, PROT_WRITE |  PROT_READ, MAP_SHARED, fd, 0); 
if(p == MAP_FAILED) abort()

Теперь p имеет адрес для сегмента общей памяти, совместно используемого двумя (или более) процессами.

Внимание! числовое значение p (виртуальный адрес памяти) может отличаться в разных процессах, поэтому, если вы хотите поместить связанный список в общую память, например, вам придется использовать смещения.

Ура, GBY

1 голос
/ 25 октября 2009

Посмотрите, как реализованы mplayer и smplayer. mplayer декодирует и показывает видео, а smplayer - это (необязательный) графический интерфейс.

...