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 和扩展开发完全陌生,所以我可能会错过一些明显的东西。

对我来说,似乎read_line_finish()可能缺少它的GAsyncResult参数,但我不知道如何实现它。

编辑:

回调函数和 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 回答