我正在尝试编写一个通过套接字服务器与 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
}