소켓 서버를 통해 Arduino와 통신하는 Gnome-Shell 확장을 작성하려고합니다. 서버와 Arduino는 잘 돌아가고 있지만 들어오는 서버 메시지를 수신하는 확장 코드가 붙어 있습니다.gjs Gnome Shell Extension에서 g_data_input_stream_read_line_async를 사용하여 소켓 스트림을 읽는 방법
비 차단 접근 방식이 필요하므로 read_line_async을 사용하는 것이 좋습니다.
그러나 나는 그것을 작동시키지 못합니다. 이 라인은 서버에서받은하지만이 read_line_finish()
으로 데이터를 읽을 실패 할 경우,
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
불려갑니다 : 여기에 지금까지 (관련 부분) 가지고거야.
저는 완전히 gio와 확장 기능이 새롭기 때문에 뭔가 확실한 것을 놓칠 수도 있습니다.
내게는 read_line_finish()
매개 변수가 누락되었을 수 있습니다. GAsyncResult 매개 변수이지만이를 구현하는 방법에 대한 단서가 없습니다.
EDIT :
콜백 함수 및 read_line_finish()는 그 파라미터가 누락되었다. Gerd의 대답 덕분에 나는 그것을 가능하게 만들 수있었습니다. '설명'에서 GIO Reference에 링크 된 예를 알아낼 수 있도록 도와 주셨습니다.
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
}
고마워요. 이것은 내가 그 문제에 도달하는 것을 도왔다;) – simonthechipmunk
위대한, 비슷한 문제에 대해 비틀 거린다면 다른 사람들이 그것을 볼 수 있도록 최종 해결책을 게시 하시겠습니까? –
예. 나는 이미 업데이트 된 코드로 나의 초기 질문을 편집했다. Gnome3의 전체 확장은 다음에서 찾을 수 있습니다. [extensions.gnome/ArduinoControl] (https://extensions.gnome.org/extension/894/arduino-control/) – simonthechipmunk