4

我正在使用 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 并正确刷新输出。

4

2 回答 2

2

我最近在 Windows 上为 selectreactor、iocpreactor 和 gtkreactor添加了支持的串行端口。我希望这种方法也可以扩展为在 Qt 反应器中支持它们。

于 2011-06-22T10:45:29.913 回答
0

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

于 2011-06-22T08:26:51.040 回答