2009-10-25 3 views
5

Ich bin ein Video-Player auf Linux zu schreiben, und ich würde es in zwei Verfahren trennen mag:Kann unter Linux ein Prozess die GUI eines anderen Prozesses rendern?

A. Decoder Prozess B. GUI

Auf diese Weise habe ich verschiedene Programmiersprachen und wenn ein verwenden könnte Problem passiert, es ist einfacher zu wissen, wo das Problem ist.

Das Problem ist, konnte A decodierte Bilder auf B Oberfläche direkt rendern verarbeiten? Ich möchte nicht einen IPC verwenden, um B diese decodierten Daten zu senden, weil das sehr ineffizient sein könnte.

Antwort

8

Sie können die XEmbed Spezifikation verwenden, die es Ihnen ermöglicht, ein X11-Fenster in ein anderes X11-Fenster einzubetten, und sie stammen möglicherweise aus unterschiedlichen Prozessen. Dies ist, was andere Media Player-Frontends normalerweise tun.

Sowohl GTK als auch Qt unterstützen XEmbed.

+0

Vielen Dank! Das ist, was ich will. – ablmf

1

Schau dir an, wie mplayer und smplayer implementiert sind. mplayer dekodiert und zeigt das Video, und smplayer ist die (optionale) GUI.

4

IPC (besonders ein Unix-Rohr) ist viel effizienter als Sie denken und es ist wahrscheinlich der richtige Mechanismus zu verwenden.

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

Jetzt:

Da Sie gefragt, wie es ohne IPC zu tun (und ich analysiere diese ohne Kontextwechsel und Kopien bedeuten), können Sie einfach ein Shared-Memory-Segment zwischen den beiden Prozessen erstellen p hat die Adresse zu einem gemeinsamen Speichersegment, das von den zwei (oder mehr) Prozessen geteilt wird.

Warnung! Der numerische Wert von p (virtuelle Adresse des Speichers) kann zwischen den Prozessen unterschiedlich sein. Wenn Sie beispielsweise eine verknüpfte Liste in den gemeinsamen Speicher legen möchten, müssen Sie Offsets verwenden.

Prost, gby