2013-02-11 1 views
0

저는 파이썬에서 zeroconf/avahi, 양방향 UDP 연결 및 Qt 인터페이스가있는 네트워크 응용 프로그램을 개발 중입니다. 내 양방향 통신에 대한 나는 UDP를 통해 원격 서버에 연결하고 서버가 다시 이야기하고 싶어하는 경우 해당 소켓에서 계속 청취하는 작은 클래스를 작성했습니다.PySide가 gobject.io_add_watch()와 공존하고 있습니까?

내 네트워크 구성 요소에는 비동기 수신자가 있습니다. 비동기 수신자는 피어로부터 도착하면서 실행되고 메시지를 내 보냅니다. 원래이 작업에 SocketServer을 사용했지만 GUI의 기본 루프를 실행하기 시작한 후 SocketServer이 내 RequestHandler을 호출하는 것을 중지한다는 것을 곧 발견했습니다.

그래서 조금 연구를하고 this을 찾았습니다.

아쉽게도 내 응용 프로그램은 이제 서버에서 데이터가 도착하자 마자 segfaults됩니다.

import sys 
import gobject 
import socket 
from PySide.QtCore import * 
from PySide.QtGui import * 

def callback(socket, *args): 
    data, address = socket.recvfrom(8192) 
    print "data arrived", data 
    return True 

class Client: 
    def __init__(self, host, port): 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.remote = (host, port) 
     gobject.io_add_watch(self.socket, gobject.IO_IN, callback) 
    def send(self, data=[]): 
     self.socket.sendto(data, self.remote) 

class Form(QDialog): 
    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 
     # widget 
     self.button = QPushButton("Hello World") 
     self.button.clicked.connect(self.sayHello) 
     layout = QVBoxLayout() 
     layout.addWidget(self.button) 
     self.setLayout(layout) 
     self.connection = Client('localhost', 7777) 
    def sayHello(self): 
     self.connection.send('hello') 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    form = Form() 
    form.show() 
    sys.exit(app.exec_()) 

내가 이런 식으로 사용하고 있습니다 :

문제가 여기에 노출 약간의 예제 프로그램입니다

  • 시작을 netcat -u -l -p 7777
  • 응용 프로그램을 버튼에
  • 클릭을 시작
  • (netcat은 netcat 콘솔에 'hello'
  • 형식을 쓸 것입니다. Enter 키를 누르
  • -> 응용 프로그램은 내가 모두 (주회 돌이의 관점에서) 비슷한 기능을 제공하는 입심 및 QT 혼합있어 것으로, 문제는 추측

을 지금 충돌하고 gobject.io_add_watch 의존 달리기 glib-mainloop에는 있지만 Qt 메인 루프가 있습니다.

PySide/Qt 프레임 워크 내에서 비동기식 수신 UDP 클라이언트를 얻는 적절한 방법은 무엇입니까? 가능한 한 내 네트워크 코드가 Qt/PySide에 의존하는 것을 피하고 싶습니다. 임베디드 헤드리스 시스템 (beaglebone)에서 재사용하고 싶습니다. Qt는 과도한 공격이 될 것 같습니다.

답변

0

같은 문제는 오히려 간단합니다 : gobject와 비 스레드를 사용할 때, 분명히 그들을 초기화해야합니다.

gobject.threads_init() 
: 상기 ' 메인'함수의 시작 부분에 다음을 첨가

문제를 해결

관련 문제