如何在Twisted中绕过多个反应器的需求

4 投票
2 回答
638 浏览
提问于 2025-04-16 20:04

我在Linux上运行一个Qt应用程序,使用的是qt4reactor。这个应用程序可以在串口上发送和接收字节。在Linux上,使用QtReactor一切运行得很好。

但是,当我把这个应用程序移植到Windows上时,就出现了问题。在Windows上,我使用的是来自_win32SerialPort的SerialPort类。_win32SerialPort中的文档说明得很清楚:

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()。但是abstract.fileno方法在_win32SerialPort中没有被重写,所以总是返回-1,这就导致了一个错误:

QSocketNotifier: Invalid Socket specified

我看到很多关于在twisted中不允许多个reactor的帖子,但我认为我在这里的假设是正确的:我需要QtReactor来支持Qt应用程序,而win32eventreactor来支持Windows串口。

或者说我有没有其他的解决方法可以用呢?

注意1:在Windows上使用QtReactor时,串口工作得很好,也就是说它们可以发送和接收数据。只有在我关闭应用程序时,才会出现“指定的套接字无效”的错误。

注意2:现在我找到了一种解决方法。我使用QtReactor,但在关闭我的应用程序时,我执行了:

serial.connectionLost(failure.Failure(Exception))

这里的serial是一个_win32serialport.SerialPort的实例。

这样一来,abstract.loseConnection就不会被调用,这意味着QtReactor的addWriter也不会被调用来刷新输出。不过,我怀疑最佳的解决方案还是调用loseConnection,确保输出能够正确刷新。

2 个回答

0

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

2

我最近在Windows上给

撰写回答