ソケット サーバーを介して 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
}