使用Qt编写跨平台应用程序(包括带有MinGW的Windows)。为了从SSL套接字读取数据,我创建了一个单独的线程。此线程出于历史原因,因为此前的应用程序是使用C socket/ssl/crypto库编写的。现在所有这些都被Qt网络库所取代。可以使用`waitForReadyRead()`而不是为`readyRead()`信号创建一个插槽吗?
对于阻塞线程,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实施。另一个较小的问题是,有时Qt'readyRead()会在多个连续的数据消息之后发出。 'socket-select()'在这里更快。 – iammilind