2009-10-25 4 views
5

Я пишу видеоплеер на Linux, и я хотел бы разделить его на 2 процесса:В Linux, может ли процесс отобразить графический интерфейс другого процесса?

A. Процесс декодирования B. GUI

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

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

ответ

8

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

Оба GTK и Qt поддержка XEmbed.

+0

Большое спасибо! Это то, что я хочу. – ablmf

1

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

4

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

Смежные вопросы