【问题标题】:GTK, child parent, shared memories andGTK,孩子的父母,共享的记忆和
【发布时间】:2012-05-06 15:21:54
【问题描述】:

我真的是 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:

我可以在结构中看到子进程生成/更改/添加的数据,并且在父进程 (shm) 中看到它没有问题。我想要做的就是在数据发生更改时立即更新 TextView,我相信我需要一个必须检查和更新的 while 循环,但由于 gtkmainloop 阻塞,这不会发生。我需要想法或方法来做到这一点。我花了一些时间试图找出与 gtk 相关的调用来帮助我,但不能。

【问题讨论】:

    标签: gtk gtk2


    【解决方案1】:

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

    要使用真正的共享内存共享数据,您需要使用@987654321@ 之类的调用,但我认为您不能说服GTK+ 只在真正的共享内存中创建它的小部件。

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

    【讨论】:

    • 放松,感谢您的重播。共享内存是指我使用 XSI 共享内存段将指针设置为指向可以从父/子或任何其他进程 (sys/shm.h) 访问的内存。是的,我相信我现在访问数据和影响更改以及其他事情的唯一方法是使用线程或尝试在共享内存级别构建我的 gtk/window/widgets。我相信在这一点上线程是更简单的方法。 “本打算给你投票,但我的声誉低于 15,再次感谢!”
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多