2009-10-25 28 views
5

Tôi viết một máy nghe nhạc video trên Linux và tôi muốn tách nó thành 2 quá trình:Trên Linux, một quá trình có thể hiển thị GUI của một quy trình khác không?

quá trình A. decoder B. GUI

Bằng cách này, tôi có thể sử dụng ngôn ngữ lập trình khác nhau và khi một vấn đề xảy ra, nó dễ dàng hơn để biết đâu là vấn đề.

Vấn đề là, có thể xử lý A hiển thị hình ảnh đã giải mã trên bề mặt B? Tôi không muốn sử dụng một số IPC để gửi B những dữ liệu được giải mã này vì điều đó có thể rất không hiệu quả.

Trả lời

8

Bạn có thể sử dụng đặc điểm XEmbed, cho phép bạn nhúng một cửa sổ X11 bên trong cửa sổ khác và chúng có thể từ các quy trình khác nhau. Đây là những gì mà các trình phát media khác thường làm.

Cả GTK và Qt đều hỗ trợ XEmbed.

+0

Cảm ơn rất nhiều! Đó là điều tôi muốn. – ablmf

1

Xem cách trình diễn mplayer và smplayer được triển khai. mplayer giải mã và hiển thị video, và smplayer là GUI (tùy chọn).

4

IPC (đặc biệt là ống Unix) hiệu quả hơn nhiều, bạn nghĩ và đó có lẽ là cơ chế phù hợp để sử dụng.

Tuy nhiên, kể từ khi bạn hỏi làm thế nào để làm điều đó mà không cần IPC (và tôi phân tích này có nghĩa là không có công tắc bối cảnh và bản sao), bạn có thể chỉ đơn giản là tạo một phân đoạn bộ nhớ chia sẻ giữa hai quá trình:

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

Bây giờ p có địa chỉ cho một phân đoạn bộ nhớ chia sẻ được chia sẻ bởi hai (hoặc nhiều) quy trình.

Cảnh báo! giá trị số của p (địa chỉ ảo của bộ nhớ) có thể khác nhau giữa các quy trình, vì vậy nếu bạn muốn đặt một danh sách được liên kết trong bộ nhớ dùng chung chẳng hạn, bạn phải sử dụng bù trừ.

Chúc mừng, gby

Các vấn đề liên quan