我正在使用 qt4reactor 在 Linux 上运行 Qt 应用程序该应用程序在串行端口上发送和接收字节。这在带有 QtReactor 的 Linux 上运行良好
但是,当我将应用程序移植到 Windows 时,我遇到了问题。在 Windows 上,我使用来自 _win32SerialPort 的 SerialPort 类。_win32SerialPort 中的文档字符串非常清楚:
需要 PySerial 和 win32all,需要配合 win32eventreactor 使用。
我假设需要使用 win32eventreactor 是因为 addReader、addWriter 方法是为 windows 编写的。
当使用 QtReactor 时,只要在传输上调用 lostConnection,就会调用 twisted.internet.abstract 中的 lostConnection,最终调用 qt4reactor addWriter 方法(以刷新输出)。
然后这会创建一个 qt4reactor.TwistedSocketNotifier,它会尝试为 select() 获取文件描述符编号。abstract.fileno 方法不会被_win32SerialPort 覆盖,所以总是返回-1,我得到一个
QSocketNotifier:指定的套接字无效
我已经看过很多关于不允许在扭曲中使用多个反应器的帖子,但是我认为我在这里假设我需要用于 Qt 应用程序的 QtReactor 和用于 Windows 串行端口的 win32eventreactor 是正确的。
或者我可以使用其他一些解决方法吗?
注意 1:在 Windows 上使用 QtReactor 时,串行端口工作正常,即它们可以发送和接收数据。只有当我关闭应用程序时,我才会得到“指定的无效套接字”
注意2:现在我找到了一种解决方法。我使用 QtReactor,但是在关闭我的应用程序时我会这样做
serial.connectionLost(失败。失败(异常))
其中 serial 是 _win32serialport.SerialPort 的一个实例
这种方式 abstract.loseConnection 永远不会被调用,这意味着永远不会调用 QtReactor addWriter 来刷新输出。我怀疑最好的解决方案涉及调用 lostConnection 并正确刷新输出。