我是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相关的电话来帮助我,但却没有。
答案 0 :(得分:2)
“共享内存”是什么意思?您是否只是在调用fork()
之前设置指针等等,以便每个进程都可以访问相同的数据?如果是这样,那么不可以实际更改数据并让所有进程看到更改。这是因为fork()
创建了进程,并且进程具有单独的地址空间。在Linux中,数据被设置为“在写入时复制”,因此看起来数据是真正共享的,但只要进程对数据进行更改,它就会获得自己的副本。
要使用真实的共享内存共享数据,您需要使用shmget()
之类的调用,但我认为您不能说服GTK +仅在真正的共享中创建其小部件存储器中。
解决方案是使用线程,并且非常小心,以避免进行多次访问,即don't call GTK+ from several different threads。