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