1

私は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 のメイン ループのため、これは不可能です。このシナリオには別の方法があるはずなので、更新または利用可能になるとすぐにユーザー - >イベント(char *)を監視できるようになります(ユーザーはshmで、イベントもshmです)が、どうすればできますかgtk にループするように指示します。Gtkスレッド?

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

私がやろうとしていることよりも簡単な方法が他にもあると確信しています。

編集1:

構造体で子プロセスから生成/変更/追加されたデータを確認でき、親プロセス (shm) で問題なく確認できます。私がやりたいのは、データが変更されたらすぐに TextView を更新することだけです。これには、チェックと更新が必要な while ループが必要だと思いますが、gtkmainloop がブロックされているため、それは起こりません。アイデアや方法が必要です。私を助けるためにgtk関連の呼び出しを見つけようとしてしばらく費やしましたが、できませんでした。

4

1 に答える 1

2

「共有メモリ」とはどういう意味ですか? fork()各プロセスが同じデータにアクセスできるように、を呼び出す前にポインタなどを設定したということですか? もしそうなら、それは実際にデータを変更するためには機能せ、すべてのプロセスが変更を認識します。これは、プロセスfork()が作成され、プロセスが個別のアドレス空間を持っているためです。Linux では、データは「書き込み時にコピー」されるように設定されているため、データは実際に共有されているように見えますが、プロセスがデータに変更を加えるとすぐに、独自のコピーが取得されます。

実際の共有メモリを使用してデータを共有するには、 などの呼び出しを使用する必要がありshmget()ますが、GTK+ にウィジェットを実際の共有メモリにのみ作成させることはできないと思います。

解決策は、スレッドを使用することです。また、複数のアクセスを行わないように十分注意してください。つまり、複数の異なるスレッドから GTK+ を呼び出さないでください。

于 2012-05-06T07:21:54.533 に答える