[Qt-interest] Subclass QNetworkRequest

Jason Wood jwood275 at googlemail.com
Tue Feb 23 10:40:49 CET 2010


Thanks for the help, I've pasted my QIODevice below, hopefully not too
large!

m_Bps - This is the throttle rate which can be changed at any time
m_Stream - This is the underlying data which is a QBuffer

Here's is my QIODevice:

ThrottledDevice::ThrottledDevice(QByteArray *data)

: m_Stream(data),

m_Bps(0)

{

m_ThrottleTimer.start();

m_iQuota = 1024;

emit readyRead();

}


qint64 ThrottledDevice::readData(char * data, qint64 maxSize)

{

if( !m_Bps )

{

emit readyRead();

return m_Stream.read(data, maxSize);

}

 QTimer::singleShot(50, this, SLOT("throttleData()"));

qint64 bytesToRead = m_iQuota;

m_iQuota = 0;

 return m_Stream.read(data, bytesToRead);

}


void ThrottledDevice::throttleData()

{

int msecs = 1000;

        if( !m_ThrottleTimer.isNull() )

            msecs = qMin<int>(1000, qMax<int>(1, m_ThrottleTimer.elapsed
()));

 m_ThrottleTimer.restart();

 m_iQuota = qMax<int>(1, m_Bps * msecs / 1000);

 emit readyRead();

}


qint64 ThrottledBuffer::writeData(const char * data, qint64 maxSize)

{

return m_Stream.write(data, maxSize);

}


bool ThrottledDevice::atEnd() const

{

return m_Stream.atEnd();

}


qint64 ThrottledDevice::bytesAvailable() const

{

return m_Stream.bytesAvailable();

}


qint64 ThrottledDevice::bytesToWrite() const

{

return m_Stream.bytesToWrite();

}


bool ThrottledDevice::canReadLine() const

{

return m_Stream.canReadLine();

}


void ThrottledDevice::close()

{

m_Stream.close();

}


bool ThrottledDevice::isSequential() const

{

return false;

}


bool ThrottledDevice::open(OpenMode mode)

{

if( !m_Stream.open(mode) )

return false;


 QIODevice::open(mode);

return true;

}


qint64 ThrottledDevice::pos() const

{

return m_Stream.pos();

}


bool ThrottledDevice::reset()

{

return m_Stream.reset();

}


bool ThrottledDevice::seek(qint64 pos)

{

return m_Stream.seek(pos);

}


qint64 ThrottledDevice::size() const

{

return m_Stream.size();

}


bool ThrottledDevice::waitForBytesWritten(int msecs)

{

return m_Stream.waitForBytesWritten(msecs);

}


bool ThrottledDevice::waitForReadyRead(int msecs)

{

return m_Stream.waitForReadyRead(msecs);

}


void ThrottledDevice::setMaxSpeed(int bps)

{

m_Bps = bps;

m_ThrottleTimer.restart();

QTimer::singleShot(50, this, SLOT("throttleData()"));

}


On Tue, Feb 23, 2010 at 7:57 AM, Markus Goetz <Markus.Goetz at nokia.com>wrote:

> ext Thiago Macieira wrote:
> > Em Terça-feira 23. Fevereiro 2010, às 08.39.38, Markus Goetz escreveu:
> >
> >> ext Thiago Macieira wrote:
> >>
> >>>> It
> >>>> doesn't seem to implement QIODevice so I'm not exactly sure how I
> could
> >>>> do it, does anyone have any ideas? I was originally using a throttled
> >>>> QIODevice as the data in the QNetworkAccessManager::post() method
> which
> >>>> is OK in Windows but OSX seems to have a much larger buffer size and
> so
> >>>> buffering to low speed (~5kB/s) causes the connection to timeout
> >>>> because the data is not sent until the internal buffer is full. Please
> >>>> correct me if I'm wrong but that does seem to be the case from my
> >>>> testing.
> >>>>
> >> Should not happen. The OS should send as soon as it has ~MTU bytes.
> >>
> >
> > Didn't we turn off the Nagle's algorithm in 4.6?
> >
> >
> True, we set TCP_NODELAY for the QNAM upload.
> Especially then a upload should not timeout. Maybe there is a flaw in
> his QIODevice.
>
> Jason, we can try to help if you show us the QIODevice.
>
> Markus
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20100223/ec84d13c/attachment.html 


More information about the Qt-interest-old mailing list