summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorShane Kearns <ext-shane.2.kearns@nokia.com>2012-05-28 16:27:58 +0100
committerQt by Nokia <qt-info@nokia.com>2012-06-14 05:26:37 +0200
commit46e40214cfd62c935a20cddc7e9ae6fb45ba1884 (patch)
tree43b2b348cdd6ddb191b6f450aabf86e0fda7d1cf /src/network
parentd6d9c8bf3245ec3d1ff05ae45d54baac64d76cec (diff)
choke uploadProgress signals
The QNetworkReply::uploadProgress signal is intended for updating UI elements such as a progress bar. Limit the signal emissions to 10 per second to prevent overloading the UI with updates. As with the downloadProgress choke, this is implemented by dropping signals that occur within 100ms of the previous emission. The 100% signal is always emitted (bytesSent == bytesTotal) When the upload size is initially unknown, this behaviour is still provided by the upload device emitting a suitable readProgress signal when EOF is reached. Task-number: QTBUG-20449 Change-Id: I77e03c8a49109106e1c375ee00380293fd326b63 Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qnetworkreply_p.h1
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp15
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp14
3 files changed, 27 insertions, 3 deletions
diff --git a/src/network/access/qnetworkreply_p.h b/src/network/access/qnetworkreply_p.h
index 04598fc712..453902392c 100644
--- a/src/network/access/qnetworkreply_p.h
+++ b/src/network/access/qnetworkreply_p.h
@@ -71,6 +71,7 @@ public:
QPointer<QNetworkAccessManager> manager;
qint64 readBufferMaxSize;
QElapsedTimer downloadProgressSignalChoke;
+ QElapsedTimer uploadProgressSignalChoke;
const static int progressSignalInterval;
QNetworkAccessManager::Operation operation;
QNetworkReply::NetworkError errorCode;
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index cf92f55cdf..e1ec9a9a95 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -888,9 +888,9 @@ void QNetworkReplyHttpImplPrivate::postRequest()
delegate->moveToThread(thread);
// This call automatically moves the uploadDevice too for the asynchronous case.
- // Start timer for progress notifications
+ // Prepare timers for progress notifications
downloadProgressSignalChoke.start();
-
+ uploadProgressSignalChoke.invalidate();
// Send an signal to the delegate so it starts working in the other thread
if (synchronous) {
@@ -1802,6 +1802,17 @@ void QNetworkReplyHttpImplPrivate::emitReplyUploadProgress(qint64 bytesSent, qin
Q_Q(QNetworkReplyHttpImpl);
if (isFinished)
return;
+
+ //choke signal emissions, except the first and last signals which are unconditional
+ if (uploadProgressSignalChoke.isValid()) {
+ if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) {
+ return;
+ }
+ uploadProgressSignalChoke.restart();
+ } else {
+ uploadProgressSignalChoke.start();
+ }
+
emit q->uploadProgress(bytesSent, bytesTotal);
}
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 9f8a6cfb5c..d0393475de 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -144,8 +144,9 @@ void QNetworkReplyImplPrivate::_q_startOperation()
}
#endif
- // Start timer for progress notifications
+ // Prepare timer for progress notifications
downloadProgressSignalChoke.start();
+ uploadProgressSignalChoke.invalidate();
if (backend && backend->isSynchronous()) {
state = Finished;
@@ -550,6 +551,17 @@ void QNetworkReplyImplPrivate::emitUploadProgress(qint64 bytesSent, qint64 bytes
{
Q_Q(QNetworkReplyImpl);
bytesUploaded = bytesSent;
+
+ //choke signal emissions, except the first and last signals which are unconditional
+ if (uploadProgressSignalChoke.isValid()) {
+ if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) {
+ return;
+ }
+ uploadProgressSignalChoke.restart();
+ } else {
+ uploadProgressSignalChoke.start();
+ }
+
pauseNotificationHandling();
emit q->uploadProgress(bytesSent, bytesTotal);
resumeNotificationHandling();