GTK,孩子的父母,共享记忆和

时间:2012-05-05 18:13:20

标签: gtk gtk2

我是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();
}

user是父,子'和其他人之间的共享结构'这个结构包含我想要在GtkTextView中的父进程中预览的数据,只要它们可用 我不知道怎么做。在父

中不可能使用这样的东西
while(1) {
     is_available_data(user);
}

将检查数据是否可用,然后将数据写入GtkTextView。由于gtk主循环,这是不可能的。在这个场景中必须有另一种方式,这样我就可以在更新或可用时立即观察用户 - >事件(char *)它应该再次打印(用户是shm,事件也是shm)但是如何我可以告诉gtk循环。 GtkThreads?

是否有一种简单的方法可以使用shm从子进程写入窗口小部件(窗口小部件在父进程中运行)?

我确信还有其他方法比我想做的更容易。

编辑1:

我可以在结构中看到从Child进程生成/更改/添加的数据,并在Parent进程(shm)中看到它没有任何问题。我想要做的就是在数据发生变化后立即更新TextView,我需要一个必须检查和更新的while循环,但由于gtkmainloop阻塞,这种情况不会发生。我需要想法或方法来做到这一点。我花了一些时间试图找出与gtk相关的电话来帮助我,但却没有。

1 个答案:

答案 0 :(得分:2)

“共享内存”是什么意思?您是否只是在调用fork()之前设置指针等等,以便每个进程都可以访问相同的数据?如果是这样,那么可以实际更改数据并让所有进程看到更改。这是因为fork()创建了进程,并且进程具有单独的地址空间。在Linux中,数据被设置为“在写入时复制”,因此看起来数据是真正共享的,但只要进程对数据进行更改,它就会获得自己的副本。

要使用真实的共享内存共享数据,您需要使用shmget()之类的调用,但我认为您不能说服GTK +仅在真正的共享中创建其小部件存储器中。

解决方案是使用线程,并且非常小心,以避免进行多次访问,即don't call GTK+ from several different threads