如何绕过扭曲的多个反应堆的需求

我正在使用qt4reactor在
Linux上运行Qt应用程序

应用程序在串行端口上发送和接收字节.

这在使用QtReactor的Linux上非常有效

但是当我将应用程序移植到Windows时,我遇到了问题.
在Windows上我使用_win32SerialPort中的SerialPort类.
_win32SerialPort中的doc字符串非常清楚:

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()的文件描述符号. _win32SerialPort不会覆盖abstract.fileno方法,因此总是返回-1并得到一个

QSocketNotifier: Invalid Socket specified

我已经看到很多关于多个反应器的帖子不允许扭曲,但我认为我在这里假设我需要Qt应用程序的QtReactor和Windows串口的win32eventreactor.

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

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

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

serial.connectionLost(failure.Failure(Exception))

其中serial是_win32serialport.SerialPort的一个实例

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

最佳答案 我最近添加了支持
selectreactor, iocpreactor, and gtkreactor on Windows的串口.我希望这种方法可以扩展到在Qt反应器中支持它们.

点赞