Gtk 从PollableSource块GUI读取数据

Gtk 从PollableSource块GUI读取数据,gtk,gtk3,vala,Gtk,Gtk3,Vala,我试图从瓦拉的操纵杆上读取状态。我可以很好地从操纵杆读取,但是,我的读取回调似乎阻止了我的GUI绘图 下面是一些演示此问题的示例代码: using Gtk; int main(string[] args) { Gtk.init(ref args); var window = new Window(); var button = new Button.with_label("Click Me!"); button.clicked.connect(() =>

我试图从瓦拉的操纵杆上读取状态。我可以很好地从操纵杆读取,但是,我的读取回调似乎阻止了我的GUI绘图

下面是一些演示此问题的示例代码:

using Gtk;

int main(string[] args) {
    Gtk.init(ref args);
    var window = new Window();
    var button = new Button.with_label("Click Me!");
    button.clicked.connect(() => {
        stdout.printf("Click!\n");
    });
    window.add(button);
    window.show_all();

    var fd = Posix.open("/dev/input/js0", Posix.O_RDONLY);
    var stream = new UnixInputStream(fd, true);
    var source = stream.create_source();
    source.set_callback((stream) => {
        stdout.printf("Joystick button press!\n");
        return true;
    });
    source.attach(null);

    Gtk.main();

    return 0;
}
我用以下方法编译它:

valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg gio-unix-2.0 --pkg posix example.vala -o example
当我从我的终端运行程序时,我得到的只是大量的“操纵杆按钮按下!”和没有GUI渲染。这只是一扇空窗户。当我注释掉附加源回调的行时:

source.attach(null);
然后重新编译,我得到了GUI的按钮,每当我点击它时,它就会做出反应


为了让我的读取回调在与GUI相同的循环中执行,我没有正确地执行什么?

我猜这是因为您没有读取通知您的数据是可用的。这是一个可轮询的源,所以它是被轮询的,因此,回调是连续触发的。尝试检索数据。C文档建议使用
g\u pollable\u input\u stream\u read\u nonblocking

现在就有意义了——在我刚刚打印到标准输出作为概念证明之前