2014-11-06 2 views
1

소켓 서버를 통해 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 

    } 

답변

2

나는 또한 GJS 새로운 오전하지만 프로그래밍 언어에 대한 확실한 이해가 다음과 같은 부분적인 해결책를 알려준 : the Gio DataStream reference에 따르면 당신은 방법에 필요한 모든 매개 변수를 제공 할 필요가 그래서 여기 비교 작업 코드는 예를 들면,

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

HTH, 게르트

+0

고마워요. 이것은 내가 그 문제에 도달하는 것을 도왔다;) – simonthechipmunk

+0

위대한, 비슷한 문제에 대해 비틀 거린다면 다른 사람들이 그것을 볼 수 있도록 최종 해결책을 게시 하시겠습니까? –

+0

예. 나는 이미 업데이트 된 코드로 나의 초기 질문을 편집했다. Gnome3의 전체 확장은 다음에서 찾을 수 있습니다. [extensions.gnome/ArduinoControl] (https://extensions.gnome.org/extension/894/arduino-control/) – simonthechipmunk

관련 문제