[Qt-interest] QNetworkAccessManager in GUI thread
Nitin Mahajan
nitinm76 at yahoo.com
Mon Feb 1 15:17:39 CET 2010
Hello,
--- On Fri, 22/1/10, Thiago Macieira <thiago at kde.org> wrote:
> From: Thiago Macieira <thiago at kde.org>
> Subject: Re: [Qt-interest] QNetworkAccessManager in GUI thread
> To: qt-interest at trolltech.com
> Date: Friday, 22 January, 2010, 12:03 AM
> Em Quinta-feira 21 Janeiro 2010, às
> 12:33:14, Nitin Mahajan escreveu:
> > Hello,
> >
> > In a GUI application like Demo Browser, I have a
> QNetworkAccessManager
> > object say "A" created in the GUI thread itself.
> >
> > I want to do the actual file download in a separate
> thread, so that my
> > GUI/mouse cursor does not freeze. Can I create a new
> QNetworkAccessManager
> > "B" in the new thread and set the cookiejar and proxy
> from "A" and still
> > download?
>
> No.
>
> QNetworkAccessManager, all its QNetworkReply objects,
> QNetworkCookieJar,
> QAbstractNetworkCache, etc., must all live in the same
> thread.
>
> > While doing the download in the GUI thread itself I
> can see the mouse
> > cursor freezing, even though the replies of the
> requests sent through
> > NetworkAccessManager arrive asynchronously. Whether
> Network acccess
> > manager does some operation which is still Blocking?
>
> Nothing is blocking. Everything is asynchronous.
>
> My guess is that your device is just that much
> underpowered. It would be
> interesting to profile the application and find out where
> the bottleneck is.
>
I did run the browser through 'ltrace' to find out the bottleneck.
I did
#ltrace -C -c -p 5190
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
95.35 9.867098 4882 2021 QApplication::notify(QObject*, QEvent*)
1.08 0.111444 165 674 QIODevice::write(char const*, long long)
0.82 0.084883 125 674 QIODevice::readAll()
0.71 0.073494 108 675 QApplication::compressEvent(QEvent*, QObject*, QPostEventList*)
0.70 0.072156 107 674 qFree(void*)
0.68 0.070630 104 674 QIODevice::isOpen() const
0.67 0.068849 102 674 QWidget::qt_metacall(QMetaObject::Call, int, void**)
------ ----------- ----------- --------- --------------------
100.00 10.348554 6066 total
and at another instance the output of ltrace is
ltrace -C -c -p 32182
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
78.47 2.219333 1392 1594 QIODevice::write(char const*,
long long)
6.13 0.173351 108 1594 QIODevice::readAll()
5.33 0.150667 94 1594 QIODevice::isOpen() const
5.14 0.145472 90 1600
QApplication::compressEvent(QEvent*, QObject*, QPostEventList*)
4.93 0.139285 87 1594
QWidget::qt_metacall(QMetaObject::Call, int, void**)
------ ----------- ----------- --------- --------------------
100.00 2.828108 7976 total
With this I think the QIODevice::write() call is the culprit.
Whether this understanding of mine is correct?
If that is true the QIODevice::write is called from
1. QHttpNetworkReplyPrivate::transferRaw(writing to Buffer) and
2. from the application while writing file from DownloadItem::downloadReadyRead().
I tried making the connections as Qt::QueuedConnection, but did not help.
Since NAM and its related objects have to be in same thread, its difficult to seperate out these two operations in different threads.
If I disconnect DownloadItem::downloadReadyRead(), still the UI freezes.
Can I get some pointers on how to approach this?
regards
-Nitin
> --
> Thiago Macieira - thiago (AT) macieira.info - thiago (AT)
> kde.org
> Senior Product Manager - Nokia, Qt Development
> Frameworks
> PGP/GPG: 0x6EF45358; fingerprint:
> E067 918B B660 DBD1 105C 966C
> 33F5 F005 6EF4 5358
>
> -----Inline Attachment Follows-----
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
Get your preferred Email name!
Now you can @ymail.com and @rocketmail.com.
http://mail.promotions.yahoo.com/newdomains/aa/
More information about the Qt-interest-old
mailing list