Python 如何在twisted中避开对多个反应堆的需求

Python 如何在twisted中避开对多个反应堆的需求,python,twisted,reactor,Python,Twisted,Reactor,我正在Linux上使用qt4reactor运行一个Qt应用程序 应用程序在串行端口上发送和接收字节。 这在带有QtReactor的Linux上运行得非常好 但是,当我将应用程序移植到windows时,我遇到了一个问题。 在windows上,我使用来自win32SerialPort的SerialPort类。 _win32SerialPort中的文档字符串非常清楚: Requires PySerial and win32all, and needs to be used with win32even

我正在Linux上使用qt4reactor运行一个Qt应用程序 应用程序在串行端口上发送和接收字节。 这在带有QtReactor的Linux上运行得非常好

但是,当我将应用程序移植到windows时,我遇到了一个问题。 在windows上,我使用来自win32SerialPort的SerialPort类。 _win32SerialPort中的文档字符串非常清楚:

Requires PySerial and win32all, and needs to be used with win32eventreactor. 需要PySerial和win32all,并且需要与win32eventreactor一起使用。 我假设需要使用win32eventreactor是因为addReader、addWriter方法是为windows编写的

使用QtReactor时,只要在传输上调用loseConnection,就会在twisted.internet.abstract中调用loseConnection,最终调用qt4reactor addWriter方法(刷新输出)

然后,这将创建一个qt4reactor.TwistedSocketNotifier,尝试获取select()的文件描述符编号。abstract.fileno方法不会被_win32SerialPort覆盖,因此总是返回-1,我得到一个

QSocketNotifier: Invalid Socket specified QSocketNotifier:指定的套接字无效 我看过很多关于twisted中不允许使用多个反应器的帖子,但是我认为我在这里正确地假设我需要QtReactor用于Qt应用程序,win32eventreactor用于windows串行端口

或者我可以使用其他解决方法吗

注1:在windows上使用QtReactor时,串行端口工作正常,即可以发送和接收数据。只有当我关闭应用程序时,我才得到“指定的套接字无效”

注2:现在我找到了一个解决方法。我使用QtReactor,但在关闭应用程序时,我会使用它

serial.connectionLost(failure.Failure(Exception)) serial.connectionLost(失败。失败(异常)) 其中serial是_win32serialport.SerialPort的实例


这样就不会调用abstract.loseConnection,这意味着永远不会调用QtReactor addWriter刷新输出。不过我怀疑最好的解决方案是调用loseConnection并正确刷新输出。

在Win32 reactor的空闲事件中调用Qt消息检查/处理函数。

我最近添加了支持的串行端口。我想,这种方法也可以扩展到在Qt反应器中支持它们。

你知道我在哪里可以得到这样的例子吗?或者至少,空闲事件定义在哪里?一点线索也没有。我只知道如何通过我对GUI和事件循环的一般知识来做到这一点。