FileReader fr;
fr.start();
FileReaderFile frf(&fr, "/home/somefile");
connect(&frf,
SIGNAL(dataAvailable
(QByteArray,
int,
int)),
SLOT(dataAvailableEvt
(QByteArray,
int,
int)));
frf.addReadRequest(0, 100000);
frf.addReadRequest(100000, 100000);
FileReader fr;
fr.start();
FileReaderFile frf(&fr, "/home/somefile");
connect(&frf, SIGNAL(dataAvailable(QByteArray, int, int)), SLOT(dataAvailableEvt(QByteArray, int, int)));
frf.addReadRequest(0, 100000);
frf.addReadRequest(100000, 100000);
To copy to clipboard, switch view to plain text mode
Implementation:
/*
* FileReaderFile
*/
FileReaderFile
::FileReaderFile(FileReader
*fr,
QString filename
) : m_filename(filename), m_fr(fr)
{
connect(this,
SIGNAL(addFile
(QString,FileReaderRequest
*)), fr,
SLOT(addFileEvt
(QString, FileReaderRequest
*)));
}
void FileReaderFile::addReadRequest(int start, int count)
{
FileReaderRequest * fri = new FileReaderRequest(m_fr, start, count);
connect(fri,
SIGNAL(dataAvailable
(QByteArray,
int,
int)),
this,
SIGNAL(dataAvailable
(QByteArray,
int,
int)));
emit addFile(m_filename, fri);
}
/*
* FileReaderRequest
*/
FileReaderRequest::FileReaderRequest(FileReader *fr, int start, int count) :
m_start(start), m_count(count)
{
moveToThread(fr);
}
bool FileReaderRequest
::process(QFile *file) {
/* Read the request, then delete ourselves. */
file->seek(m_start);
emit dataAvailable(ba, m_start, ba.length());
deleteLater();
return true;
}
/*
* FileReader
*/
FileReader::FileReader()
{
moveToThread(this);
}
void FileReader
::addFileEvt(const QString & filename, FileReaderRequest
*fri
) {
if (m_files.contains(filename))
{
file = m_files.value(filename);
}
else
{
file = new QFile(filename
);
m_files.insert(filename, file);
}
fri->process(file);
}
void FileReader::run()
{
exec();
}
/*
* FileReaderFile
*/
FileReaderFile::FileReaderFile(FileReader *fr, QString filename) :
m_filename(filename), m_fr(fr)
{
connect(this, SIGNAL(addFile(QString,FileReaderRequest*)), fr, SLOT(addFileEvt(QString, FileReaderRequest*)));
}
void FileReaderFile::addReadRequest(int start, int count)
{
FileReaderRequest * fri = new FileReaderRequest(m_fr, start, count);
connect(fri, SIGNAL(dataAvailable(QByteArray, int, int)), this, SIGNAL(dataAvailable(QByteArray, int, int)));
emit addFile(m_filename, fri);
}
/*
* FileReaderRequest
*/
FileReaderRequest::FileReaderRequest(FileReader *fr, int start, int count) :
m_start(start), m_count(count)
{
moveToThread(fr);
}
bool FileReaderRequest::process(QFile *file)
{
/* Read the request, then delete ourselves. */
file->seek(m_start);
QByteArray ba = file->read(m_count);
emit dataAvailable(ba, m_start, ba.length());
deleteLater();
return true;
}
/*
* FileReader
*/
FileReader::FileReader()
{
moveToThread(this);
}
void FileReader::addFileEvt(const QString & filename, FileReaderRequest *fri)
{
QFile * file;
if (m_files.contains(filename))
{
file = m_files.value(filename);
}
else
{
file = new QFile(filename);
file->open(QIODevice::ReadOnly);
m_files.insert(filename, file);
}
fri->process(file);
}
void FileReader::run()
{
exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks