【问题标题】:Reading from PollableSource blocks GUI从 PollableSource 块 GUI 读取
【发布时间】:2013-08-21 01:34:16
【问题描述】:

我正在尝试从 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,只要我点击它就会做出反应。

为了让我的读取回调在与我的 GUI 相同的循环中执行,我做错了什么?

【问题讨论】:

    标签: gtk gtk3 vala


    【解决方案1】:

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

    【讨论】:

    • 现在说得通了——在我只是打印到标准输出作为概念验证之前
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多