PySide - QTimer触发socket.socket.recv()挂起

时间:2014-01-01 14:58:08

标签: qt sockets tcp pyside

我构建了一个由QObject派生类控制的简单PySide Gui应用程序。该类包含连接到tcp端口和接收数据的方法。我的计划是使用QTimer触发器socket_read()方法,该方法从tcp套接字读取任何输入并处理数据而不会阻止主应用程序。

到目前为止,我已将主应用程序成功连接到tcp端口,并QTimer触发socket_read()。当socket_read()包含简单的打印语句时,应用程序保持响应并且一切正常但是当我尝试在方法中使用socket.socket.recv()时,该方法继续在循环中接收数据并在该方法中运行代码但是应用程序的其余部分冻结。

在这种情况下,是否有人知道我的错误或我需要做些什么来保持应用程序的响应?

from PySide import QtGui, QtCore
import socket

class AppController(QtCore.QObject):
    def __init__(self, main_window):
        QtCore.QObject.__init__(self)

        # socket
        self.socket_connection = None
        self.socket_listen_timer = QtCore.QTimer(self)
        self.socket_listen_timer.timeout.connect(self.socket_read)


    def socket_connect(self, port):
        print 'connecting'
        host_name = 'localhost'
        socket_connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket_connection.bind((host_name, port))
        socket_connection.listen(1)
        self.socket_connection, addr = socket_connection.accept()
        self.main_window.console_info('Connected to {0}'.format(addr))
        self.socket_listen_timer.start(1000)


    def socket_disconnect(self):
        self.main_window.console_info('Disconnecting')
        self.socket_listen_timer.stop()
        if self.socket_connection is not None:
            self.socket_connection.close()


    def socket_read(self):
        print 'test'
        data = self.socket_connection.recv(1024)
        do_something_with_data(data)

0 个答案:

没有答案