【发布时间】:2017-06-14 12:21:44
【问题描述】:
使用 Qt(包括带有 MinGW 的 Windows)编写跨平台应用程序。为了从 SSL 套接字读取数据,我正在创建一个单独的线程。由于历史原因,该线程存在,因为之前该应用程序是使用 C 套接字/ssl/crypto 库编写的。现在所有这些都被 Qt Network 库所取代。
对于阻塞线程,waitForReadyRead(milliseconds) 似乎是更好的选择。现在根据 Qt 层次结构:
QIODevice
|
QAbstractSocket
|
QTcpSocket
|
QSslSocket
QAbscractSocket::waitForReadyRead() 的文档建议:
注意:此功能在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和 readyRead() 信号。
但是QIODevice::waitForReadyRead()中没有提到类似的警告。
问题:QSslSocket::waitForReadyRead() 是否始终可用于所有平台?
为什么我不使用 readyRead() 信号?出于某种奇怪的原因,如果我使用 readyRead() 插入某个方法然后它不会被调用。此外, QSslSocket::write() 也不起作用,否则与上述方法一起工作。由于我的代码很复杂,我无法在这里展示它。
【问题讨论】:
-
您声明您正在使用线程。如果
readyRead发射器和接收器在不同的线程上,你确定接收器的线程有一个活动的事件循环吗?顺便说一句,我不禁觉得使用waitForReadyRead只会暂时掩盖真正潜在问题的症状。 -
@G.M.最初只有 1 个线程建立 TLS 连接并与服务器交换几个自定义消息(读取和写入)。只有当这成功时,我才开始一个新的循环用于独占读取目的。对于
readyRead(),我确信我这边一定存在编码/理解错误,才能让它发挥作用。但是,如果我必须使用waitFor...()方法,那么我当前的设计可以自行运行。唯一担心的是它的 Windows 实现。另一个较小的问题是,有时 QtreadyRead()在多个连续数据消息之后发出。socket-select()在这里更快。
标签: c++ qt ssl blocking qt-signals