2

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 と同じループで実行するために正しく行っていないことは何ですか?

4

1 に答える 1