0

我正在用 python 开发一个网络应用程序,它具有 zeroconf/avahi、双向 UDP 连接和 Qt 接口。对于我的双向通信,我编写了一个小类,它通过 UDP 连接到远程服务器并继续侦听该套接字,以防服务器想要回话。

我真正想要的是,我的网络组件有一个异步接收器,它只是在消息从对等方到达时运行并发出消息。最初我用于SocketServer此任务,但我很快发现,一旦我开始运行 GUI 的主循环,SocketServer它将停止调用我。RequestHandler

所以我研究了一下,发现了这个,我适应了我的需要。

不幸的是,一旦数据从服务器到达,我的应用程序现在就会出现段错误。

这是一个暴露问题的小示例程序:

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 会写 'hello'
  • 在 netcat 控制台中输入一些内容并按 Enter
  • -> 应用程序崩溃

现在我想问题是,我正在混合 glib 和 qt,它们都提供类似的功能(就 mainloop 而言),并且gobject.io_add_watch依赖于正在运行的 glib-mainloop,但是有一个 Qt mainloop。

在 PySide/Qt 框架中获取异步接收 UDP 客户端的正确方法是什么?如果可能的话,我想避免我的网络代码依赖于 Qt/PySide,因为我想在嵌入式无头系统(beaglebone)上重用它,而 Qt 在这里似乎有点矫枉过正。

4

1 回答 1

0

似乎问题很简单:当使用非线程时gobject,必须显式地初始化它们。

在' main '函数的开头添加以下内容可以解决问题:

 gobject.threads_init()
于 2013-03-28T12:34:45.470 回答