我正在尝试从 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/