저는 파이썬에서 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는 과도한 공격이 될 것 같습니다.