2

ソケット サーバーを介して Arduino と通信する Gnome-Shell 拡張機能を作成しようとしています。サーバーと Arduino は正常に動作していますが、受信サーバー メッセージをリッスンする拡張コードで行き詰まっています。

ブロックしないアプローチが必要なので、read_line_asyncを使用するのは完璧に思えます。

しかし、私はそれを機能させることができません。ここに私がこれまでに得たものがあります(関連部分):

    let sockClient, sockConnection, output_reader, receivedline;

// connect to socket
    sockClient = new Gio.SocketClient();
    sockConnection = sockClient.connect_to_host("127.0.0.1:21567", null, null);


// read server socket

    output_reader = new Gio.DataInputStream({ base_stream: sockConnection.get_input_stream() });

    output_reader.read_line_async(0, null, _SocketRead, null);


// callback

    function _SocketRead() {

        let [lineout, charlength, error] = output_reader.read_line_finish();

        receivedline = lineout;
        // process received data

    }

非同期関数は問題なく開始さ_SocketReadれ、サーバーから受信した行があるときにも呼び出されますが、 でデータを読み取ることができませんread_line_finish()

私は gio と拡張機能の開発にまったく慣れていないので、明らかなことを見逃す可能性があります。

私には、 GAsyncResultread_line_finish()パラメーターが欠落しているように見えますが、実装方法についての手がかりがありません。

編集:

Callback 関数と read_line_finish() にパラメータがありませんでした。Gerdの答えのおかげで、私はそれを機能させることができました。「説明」の下のGIOリファレンスにリンクされている例を理解するのに役立ちました。したがって、比較のための作業コードは次のとおりです。

    let sockClient, sockConnection, output_reader, receivedline;

// connect to socket
    sockClient = new Gio.SocketClient();
    sockConnection = sockClient.connect_to_host("127.0.0.1:21567", null, null);


// read server socket

    output_reader = new Gio.DataInputStream({ base_stream: sockConnection.get_input_stream() });

    output_reader.read_line_async(0, null, _SocketRead, null);


// callback

    function _SocketRead(gobject, async_res, user_data) {

        let [lineout, charlength, error] = gobject.read_line_finish(async_res);

        receivedline = lineout;
        // process received data

    }
4

1 に答える 1

3

私もGJSは初めてですが、プログラミング言語をしっかりと理解しているため、次の部分的な解決策にたどり着きました。Gio DataStreamリファレンスによると、必要なすべてのパラメーターをメソッドに提供する必要があります。

let asyncResult = new Gio.SimpleAsyncResult();
let length;
let lineout = output_reader.read_line_finish(asyncResult, length);

HTH、ゲルト

于 2014-11-16T15:59:37.633 に答える