2009-10-25 3 views
5

Je vous écris un lecteur vidéo sur Linux et je voudrais séparer en deux processus:Sous Linux, un processus pourrait-il rendre l'interface graphique d'un autre processus?

A. processus de décodage B. GUI

De cette façon, je pouvais utiliser différents langages de programmation et lorsqu'un problème arrive, il est plus facile de savoir où est le problème.

Le problème est, pourrait traiter A rendre des images décodées sur la surface de B directement? Je ne veux pas utiliser un IPC pour envoyer B ces données décodées car cela pourrait être très inefficace.

Répondre

8

Vous pouvez utiliser la spécification XEmbed, qui vous permet d'intégrer une fenêtre X11 dans une autre et qui peut provenir de différents processus. C'est ce que font typiquement les autres acteurs des médias.

Les deux GTK et Qt prennent en charge XEmbed.

+0

Merci beaucoup! C'est ce que je veux. – ablmf

1

Regardez comment mplayer et smplayer sont implémentés. mplayer décode et affiche la vidéo, et smplayer est l'interface graphique (optionnelle).

4

IPC (en particulier un tuyau Unix) est beaucoup plus efficace que vous ne le pensez et c'est probablement le bon mécanisme à utiliser.

Cependant, puisque vous avez demandé comment le faire sans IPC (et j'analyser ce à dire sans changement de contexte et des copies), vous pouvez simplement créer un segment de mémoire partagée entre les deux processus:

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() 

maintenant p a l'adresse d'un segment de mémoire partagé partagé par les deux processus (ou plus).

Avertissement! la valeur numérique de p (adresse virtuelle de la mémoire) peut être différente entre les processus, donc si vous voulez mettre une liste chaînée dans la mémoire partagée par exemple, vous devez utiliser des décalages.

Cheers, Gby

Questions connexes