Привет. Столкнулся с такой задачей. У меня в потоке открывается файл QFile, его содержимое передаю в QDomDocument::setContent(&file). Файл порядка 12 МБайт, парсится долго, иногда нужно прервать его парсинг. Но я так и не понял, как сделать корректно досрочное завершение потока.
#include <QThread>
#include <QDomDocument>
#include <QDomElement>
#include "railcore_global.h"
class RAILCORESHARED_EXPORT CDocReaderThread : public QThread
{
Q_OBJECT
QDomDocument * fdocument;
QString ffileName;
Q_DISABLE_COPY(CDocReaderThread)
public:
explicit CDocReaderThread(QDomDocument * document, const QString & fileName, QObject *parent = 0);
void run();
signals:
void done();
void error();
public slots:
};
#include <QFile>
#include "cdocreaderthread.h"
CDocReaderThread::CDocReaderThread(QDomDocument *document, const QString &fileName, QObject *parent) :
QThread(parent),fdocument(document),ffileName(fileName)
{
}
void CDocReaderThread::run()
{
if(!fdocument || ffileName.isEmpty())
{
emit error();
}
else
{
QFile file(ffileName);
if(!file.open(QIODevice::ReadOnly))
{
emit error();
return;
}
QString errorMsg = "Unknown error";
int errorLine = -1;
int errorColumn = -1;
if(!fdocument->setContent(&file,true,&errorMsg,&errorLine,&errorColumn))
{
qDebug("ArmDocument parse error: line %d, column %d: %s",errorLine,errorColumn,qPrintable(errorMsg));
emit error();
return;
}
emit done();
}
Если делать так:
void abortRead()
{
reader->quit();
reader->wait();
}
То поток завершится после полного парсинга документа. и возвращается сигнал done().
Если пользоваться reader->terminate() то прога тупо виснет... Подскажите есть ли способ как то в процессе парсинга документа сделать завершение потока?