2

我正在使用twistd. 这是应用程序中唯一的服务:

class GameClientService(internet.TCPClient):
    def __init__(self, serverHost, serverPort):
        self.wxApp = wx.App(False)
        reactor.registerWxApp(self.wxApp)
        self.lobbyFrame = gui.LobbyFrame()

        internet.TCPClient.__init__(self, serverHost, serverPort, LobbyProtocolFactory(self.lobbyFrame))

    def stopService(self):
        internet.TCPClient.stopService(self)
        print "Stop service!"
        destroyedD = defer.Deferred()
        self.lobbyFrame.CloseWithCallback(destroyedD.callback, True)
        print "close called!"
        def fired(result):
            print "'Destroyed' deferred has fired with %s" % (result,)
        destroyedD.addCallback(fired)
        return destroyedD

CloseWithCallback定义wx.Frame如下:

def CloseWithCallback(self, callback, *callbackArgs):
    def destroyed(event):
        event.Skip()
        callback(*callbackArgs)
    self.Bind(wx.EVT_WINDOW_DESTROY, destroyed)
    self.Close()

LobbyProtocol的工厂中,如果连接失败,我会停止反应器:

def clientConnectionFailed(self, connector, reason):
    print "Client connection failed: %s" % reason.getErrorMessage()
    reactor.stop()

我在没有监听服务器的情况下运行客户端,因此连接失败,但有时(可能超过一半,但并非总是如此):

2012-11-12 18:43:29-0500 [-] Started connecting <twisted.internet.tcp.Connector instance at 0x030E3800>
2012-11-12 18:43:30-0500 [Uninitialized] Client connection failed: Connection was refused by other side: 10061: No connection could be made because the target machine actively refused it..
2012-11-12 18:43:30-0500 [Uninitialized] Stopping factory <network.LobbyProtocol.LobbyProtocolFactory instance at 0x030E3698>
2012-11-12 18:43:30-0500 [-] Stop service!
2012-11-12 18:43:30-0500 [-] 'Destroyed' deferred has fired with True
2012-11-12 18:43:30-0500 [-] Traceback (most recent call last):
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14669, in <lambda>
2012-11-12 18:43:30-0500 [-]     lambda event: event.callable(*event.args, **event.kw) )
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\site-packages\twisted\internet\_threadedselect.py", line 232, in _interleave
2012-11-12 18:43:30-0500 [-]     msg, args = self.toMainThread.get_nowait()
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\Queue.py", line 190, in get_nowait
2012-11-12 18:43:30-0500 [-]     return self.get(False)
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\Queue.py", line 165, in get
2012-11-12 18:43:30-0500 [-]     raise Empty
2012-11-12 18:43:30-0500 [-] Queue.Empty
2012-11-12 18:43:30-0500 [-] Server Shut Down.
2012-11-12 18:43:30-0500 [-] Server Shut Down.

这让我很不舒服。如何确保回溯永远不会运行?我做错了什么?

4

1 回答 1

2

我已经进行了适当的清洗,因此我的代码现在被净化了:

class CleanExitApp(wx.App):
    def __init__(self, *args, **kwargs):
        wx.App.__init__(self, *args, **kwargs)

        self.exitDeferreds = []

    def AddExitDeferred(self, exitDeferred):
        self.exitDeferreds.append(exitDeferred)

    def OnExit(self):
        print "OnExit"
        for exitDeferred in self.exitDeferreds:
            exitDeferred.callback(True)

class GameClientService(internet.TCPClient):
    def __init__(self, serverHost, serverPort):
        self.wxApp = CleanExitApp(False)
        reactor.registerWxApp(self.wxApp)
        self.lobbyFrame = gui.LobbyFrame() 

        internet.TCPClient.__init__(self, serverHost, serverPort, LobbyProtocolFactory(self.lobbyFrame))

    def stopService(self):
        internet.TCPClient.stopService(self)
        print "Stop service!"
        exitD = defer.Deferred()
        self.wxApp.AddExitDeferred(exitD)
        self.lobbyFrame.Close()
        print "close called!"
        def fired(result):
            print "'Destroyed' deferred has fired with %s" % (result,)
        exitD.addCallback(fired)
        return exitD

输出使我们感到高兴:

2012-11-12 18:56:15-0500 [-] Started connecting <twisted.internet.tcp.Connector instance at 0x032AB8C8>
2012-11-12 18:56:16-0500 [Uninitialized] Client connection failed: Connection was refused by other side: 10061: No connection could be made because the target machine actively refused it..
2012-11-12 18:56:16-0500 [Uninitialized] Stopping factory <network.LobbyProtocol.LobbyProtocolFactory instance at 0x032AB7B0>
2012-11-12 18:56:16-0500 [-] Stop service!
2012-11-12 18:56:16-0500 [-] close called!
2012-11-12 18:56:16-0500 [-] OnExit
2012-11-12 18:56:16-0500 [-] 'Destroyed' deferred has fired with True
2012-11-12 18:56:16-0500 [-] Server Shut Down.
2012-11-12 18:56:16-0500 [-] Server Shut Down.

赞美主!

人们只是想知道主是否有不同的信息......一个更内置的信息,不需要如此折磨的代码?

于 2012-11-12T23:57:48.393 回答