2012-05-05 11 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で親プロセスにプレビューしたいデータが含まれていますどのようにそれを行うかわからない。これは、データが利用可能であるかどうかを確認してからGtkTextViewにデータを書き込みます親

while(1) { 
    is_available_data(user); 
} 

にこのようなものを使用することはできません。これは、gtkのメインループのためには不可能です。このシナリオでは、別の方法がなければならないので、ユーザーのイベント(char *)が更新または使用可能になるとすぐに見ることができます(ユーザーはshmとイベントもshmです)。 gtkにループを伝えます。 GtkThreads?

shmを使用して、子プロセス(ウィジェットが親プロセスで実行されている場所)からウィジェットに書き込む簡単な方法はありますか?

私は何をしようとしているよりも簡単な方法があると確信しています。

編集1:

Iは、データが生成さ見ることができます/変更/構造体に子プロセスから添加し、親プロセス(SHM)で問題なくそれを見ます。私がしたいのは、データが変更されると直ちにTextViewを更新することです。確認して更新する必要があるwhileループが必要ですが、gtkmainloopはブロックされているので、これは起こりません。私はアイデアやそれを行う方法が必要です。私は時々、私を助けるためにgtk関連の呼び出しを理解しようとしましたが、できませんでした。

答えて

2

「共有メモリ」とはどういう意味ですか? fork()を呼び出す前にポインタなどを設定するだけで、各プロセスは同じデータにアクセスできますか?もしそうなら、ではなく、が実際にデータを変更し、すべてのプロセスに変更が反映されます。これは、fork()プロセスを作成し、プロセスが別々のアドレススペースを持つためです。 Linuxでは、データは「コピー時にコピーされる」ように設定されているため、データが本当に共有されているように見えますが、プロセスがデータを変更するとすぐに独自のコピーが取得されます。

リアル共有メモリを使用してデータを共有するには、そのよう shmget()としてコールを使用する必要がありますが、私はあなたが唯一の真の共有メモリにそのウィジェットを作成するにはGTK +を説得することができないと思います。

解決策は、スレッドを使用し、複数のアクセスを避けるためには非常に注意してください。つまり、don't call GTK+ from several different threadsです。

+0

リプレイに感謝します。共有メモリとは、親/子プロセスや他のプロセス(sys/shm.h)からアクセスできるメモリを指すポインタを設定するXSI共有メモリセグメントを使用したことを意味します。はい、データやエフェクトの変更などにアクセスする私の唯一の方法は、スレッドを使用するか、共有メモリレベルでgtk /ウィンドウ/ウィジェットを作成することです。私は糸がこの時点で行くのがより簡単な方法だと信じています。 "あなたをアップアップするつもりでしたが、私の評判は15歳未満です、もう一度ありがとう!" – x11