2012-05-05 36 views
1

我真的是GTK的新手,一直在努力想象它。我現在已經是GTK,孩子的父母,共享內存和

Widgets *w;    // shared mem 
struct mystruct *user; // shared mem 
.... 
pid = fork(); 
..... 
if(pid == 0) { 
    while(1){ 
     get_events(user); 
     parse_events(user); 
     // can I write to Widgets *w and the changes happen in the 
     // parent process that is running the gtkmainloop 
     write_to_textview("child", w); 
    } 
} else { 
    ...... 
    write_to_textview("parent", w); 
    gtk_widget_show_all(window); 
    gtk_main(); 
} 

用戶的父母,孩子和其他人「之間的共享結構這種結構包含,我想在一個GtkTextView父進程,儘快爲他們有空來預覽數據 我不知道該怎麼做。這是不可能使用這樣的事情在父

while(1) { 
    is_available_data(user); 
} 

,將檢查數據是否可用,然後將數據寫入到GtkTextView。由於gtk主循環,這是不可能的。在這個senario中必須有另外一種方式,所以我可以在更新或者可用的時候立即監視用戶 - >事件(char *),並且應該再次打印(用戶是shm,事件也是shm),但是怎麼能我告訴gtk循環。 GtkThreads?

是否有一種使用shm從子進程寫入小部件的簡單方法(小部件在父進程中運行的位置)?

我確定有其他方法比我想要做的更容易。

編輯1:

我可以看到數據產生/變更/從子進程在struct並將看到它與在父進程(SHM)沒有問題。我想要做的就是更新TextView,只要數據發生變化,我相信我需要一個while循環,必須檢查和更新,但由於gtkmainloop阻塞,所以無法進行。我需要創意或方法來做到這一點。我花了一段時間試圖找出gtk相關的電話來幫助我,但不能。

回答

2

「共享內存」是什麼意思?您是否意味着在調用fork()之前設置指針等等,以便每個進程訪問相同的數據?如果是這樣,那麼而不是的工作實際上是改變數據,並讓所有進程看到變化。這是因爲fork()創建了一個進程,並且進程具有單獨的地址空間。在Linux中,數據設置爲「在寫入時複製」,因此看起來數據是真正共享的,但只要進程對數據進行更改,它就會獲得自己的副本。

要共享使用真正共享內存的數據,你需要使用一個調用,如shmget(),但我不認爲你能說服GTK +只有在共享內存真正創造它的部件。

解決方案是使用線程,並非常小心避免進行多次訪問,即don't call GTK+ from several different threads

+0

放鬆感謝您的重播。通過共享內存我的意思是我使用XSI共享內存段設置指針指向可以從父/子或任何其他進程(sys/shm.h)訪問的內存。是的,我相信現在我唯一能夠訪問數據並影響變化和其他事情的方法是使用線程或試圖在共享內存級別構建我的gtk/window/widgets。我相信線程在這一點上是更簡單的方法。 「你會喜歡你,但我的聲望低於15,再次感謝!」 – x11