是否可以使用`waitForReadyRead()`而不是为`readyRead()`信号创建一个槽?

iam*_*ind 6 c++ ssl qt blocking qt-signals

使用Qt编写跨平台应用程序(包括带MinGW的Windows).为了从SSL套接字读取数据,我正在创建一个单独的线程.这个帖子是出于历史原因,因为之前的应用程序是使用C socket/ssl/crypto库编写的.现在所有这些都被Qt网络库取代了.

对于阻塞线程,waitForReadyRead(milliseconds)似乎是一个更好的选择.现在根据Qt层次结构:

QIODevice
   |
QAbstractSocket
   |
QTcpSocket
   |
QSslSocket
Run Code Online (Sandbox Code Playgroud)

QAbscractSocket::waitForReadyRead()建议文件:

注意:此功能可能在Windows上随机失败.如果您的软件将在Windows上运行,请考虑使用事件循环和readyRead()信号.

但类似的警告是没有提到的QIODevice::waitForReadyRead().

问题:是否QSslSocket::waitForReadyRead()始终可用于所有平台?


为什么我没有使用readyRead()信号?
出于一些奇怪的原因,如果我使用readyRead()插入一些方法,那么它就不会被调用.此外,QSslSocket :: write()也不起作用,否则使用上述方法.由于我的代码很复杂,我无法在此处提供.

Qee*_*eek 5

对于你的问题:是的你可以使用QSslSocket::waitForReadyRead()但是在Widows上它甚至可以在数据进入套接字时超时.因此,如果发生超时,您必须检查它是否超时或方法失败.如果QAbstractSocket::bytesAvailable() > 0数据准备好读取则检查很简单,否则超时.

当您使用小超时并且您的应用程序对延迟不敏感时(例如温度传感器和云与温度历史记录之间的通信),这种方法是可行的.但是如果您不接受任何不必要的延迟,那么您应该使用信号/插槽接口.

有关更多信息,您可以查看Qt的错误跟踪器上的错误报告.