如何在Twisted中绕过多个反应器的需求
我在Linux上运行一个Qt应用程序,使用的是qt4reactor。这个应用程序可以在串口上发送和接收字节。在Linux上,使用QtReactor一切运行得很好。
但是,当我把这个应用程序移植到Windows上时,就出现了问题。在Windows上,我使用的是来自_win32SerialPort的SerialPort类。_win32SerialPort中的文档说明得很清楚:
Requires PySerial and win32all, and needs to be used with win32eventreactor.
我认为需要使用win32eventreactor是因为addReader和addWriter这两个方法是为Windows编写的。
当使用QtReactor时,一旦在传输中调用loseConnection,这个方法会在twisted.internet.abstract中调用loseConnection,最终会调用qt4reactor的addWriter方法(用于刷新输出)。
这会创建一个qt4reactor.TwistedSocketNotifier,它试图获取一个文件描述符号用于select()。但是abstract.fileno方法在_win32SerialPort中没有被重写,所以总是返回-1,这就导致了一个错误:
QSocketNotifier: Invalid Socket specified
我看到很多关于在twisted中不允许多个reactor的帖子,但我认为我在这里的假设是正确的:我需要QtReactor来支持Qt应用程序,而win32eventreactor来支持Windows串口。
或者说我有没有其他的解决方法可以用呢?
注意1:在Windows上使用QtReactor时,串口工作得很好,也就是说它们可以发送和接收数据。只有在我关闭应用程序时,才会出现“指定的套接字无效”的错误。
注意2:现在我找到了一种解决方法。我使用QtReactor,但在关闭我的应用程序时,我执行了:
serial.connectionLost(failure.Failure(Exception))
这里的serial是一个_win32serialport.SerialPort的实例。
这样一来,abstract.loseConnection就不会被调用,这意味着QtReactor的addWriter也不会被调用来刷新输出。不过,我怀疑最佳的解决方案还是调用loseConnection,确保输出能够正确刷新。
2 个回答
在Win32反应器的空闲事件中调用Qt的消息检查和处理函数。
我最近在Windows上给