[英]Qt: Waiting for a signal using QEventLoop, what if the signal is emitted too early?
[英]Qt: QSslSocket::bytesWritten() signal is emitted too often
我使用以下代碼通過套接字傳輸大文件, 而不會占用大量內存 :
connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
refillSocketBuffer(128*1024);
}
void FtpRetrCommand::refillSocketBuffer(qint64 bytes)
{
if (!file->atEnd()) {
socket->write(file->read(bytes));
} else {
socket->disconnectFromHost();
}
}
這在QTcpSocket
可以正常工作,但是在加密的QSslSocket上, bytesWritten()
信號會不斷發出,這導致我的函數始終向套接字寫入數據,其速度比通過套接字發送數據的速度要快,因此最終它的內存使用量達到400 MB,操作系統將其殺死。
經過更多的挖掘,我才找到答案,實際上是在文檔中。 看來我應該對SSL套接字使用encryptedBytesWritten()
代替:
注意:請注意bytesWritten()信號和cryptobytesWritten()信號之間的區別。 對於QTcpSocket,一旦將數據寫入TCP套接字,就會發出bytesWritten()。 對於QSslSocket,在對數據進行加密時將發出bytesWritten(),而一旦將數據寫入TCP套接字,就將發出cryptobytesWritten()。
所以我需要更改此代碼:
connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
對此:
if (socket->isEncrypted()) {
connect(socket, SIGNAL(encryptedBytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
} else {
connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.