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

user 是父、子“和其他人”之间的共享结构,该结构包含我想在 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 回答