gtk - 从 PollableSource block GUI 中读取

标签 gtk gtk3 vala

我正在尝试从 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(() => {
        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,其中的按钮每当我单击它时就会使用react。

我没有正确执行哪些操作来让读取回调在与 GUI 相同的循环中执行?

最佳答案

我的猜测是,这是因为您没有阅读通知您的数据可用。这是一个可轮询的源,因此它会被轮询,因此回调会被连续触发。尝试检索数据。 C 文档建议使用 g_pollable_input_stream_read_nonblocking 来实现此目的。

关于gtk - 从 PollableSource block GUI 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347536/

相关文章:

gtk - 如何在 Glade3 中将子级添加到 StatusBar?

python - 带有 Python3 和 Gtk3 的 MVC

c++ - 使用 OpenGL 编译 GTK+

c - 如何在 gtk 上使用任何小部件的可见性?

gtk - 如何转置开罗上下文或更改轴的方向?

从 glade 克隆一个 GtkWidget,这样它就可以在应用程序中多次重用

css - 如何删除 GTK 条目(文本框)边框?

glib - 将 GLib.Array 转换为内置数组

gtk3 - 重写 vala 中的方法

Vala 引用计数和参数传递