GTK、儿童家长、共享记忆和

GTK、儿童家长、共享记忆和,gtk,gtk2,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

我对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循环。GTK线程

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

我相信还有其他方法比我想做的更简单

编辑1:

我可以在struct中看到从子进程生成/更改/添加的数据,并且在父进程(shm)中看到它没有问题。我所要做的就是在数据更改时立即更新TextView,我相信这需要一个while循环,必须检查和更新,但这不能发生,因为gtkmainloop正在阻塞。我需要一些想法或方法来做这件事。我花了一段时间试图找出与gtk相关的电话来帮助我,但没有。你说的“共享内存”是什么意思?您的意思是在调用
fork()
之前设置指针等,以便每个进程都可以访问相同的数据吗?如果是这样的话,那么这对于实际更改数据并让所有流程都看到更改并不起作用。这是因为
fork()。在Linux中,数据被设置为“写时复制”,因此看起来数据是真正共享的,但一旦进程更改了数据,它就会得到自己的副本

要使用真正的共享内存共享数据,您需要使用调用,例如
,但我认为您无法说服GTK+仅在真正的共享内存中创建其小部件


解决方案是使用线程,并非常小心地避免进行多次访问,即…

展开感谢您的重播。所谓共享内存,我的意思是我使用XSI共享内存段设置指针,指向可以从父/子进程或任何其他进程(sys/shm.h)访问的内存。是的,我相信我现在访问数据并影响更改和其他事情的唯一方法是使用线程或尝试在共享内存级别构建gtk/window/Widget。我相信在这一点上,线程是更简单的方法。“我本来打算给你投票的,但我的名声还不到15岁,再次感谢你!”