【问题标题】:How to get around the need for multiple reactors in twisted如何解决扭曲中对多个反应器的需求
【发布时间】: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 并正确刷新输出。

【问题讨论】:

    标签: python twisted reactor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你知道我在哪里可以得到这样的例子吗?或者至少,空闲事件在哪里定义?谢谢
      • 没有线索。我只知道如何通过我对 GUI 和事件循环的一般知识来做到这一点。
      猜你喜欢
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多