[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