#include "numbermoveproxy.h" NumberMoveProxy::NumberMoveProxy(NumberListModel *oldSourceModel, NumberListModel *oldDestModel) { this->progress = 0; this->stop = false; this->oldSourceModel = oldSourceModel; this->oldDestModel = oldDestModel; this->batchSize = 100; this->step1Progress = 2; this->step2Progress = 98; this->threadCreated = false; } NumberMoveProxy::~NumberMoveProxy() { qDebug()<moveType = moveType; } void NumberMoveProxy::setRegexpList(QList regexpList) { this->regexpList = regexpList; } void NumberMoveProxy::setBatchSize(int batchSize) { this->batchSize = batchSize; } void NumberMoveProxy::setRange(QString range1, QString range2) { this->range1 = range1; this->range2 = range2; } void NumberMoveProxy::abort() { this->stop = true; } void NumberMoveProxy::onChildTaskFinished(QStringList sourceSegments, QList sourceNumbers, QStringList destSegments, QList destNumbers) { QMutexLocker locker(&mutex); this->counter--; this->progress++; this->sourceSegments.append(sourceSegments); this->sourceNumbers.append(sourceNumbers); this->destSegments.append(destSegments); this->destNumbers.append(destNumbers); double s1 = this->progress; double s2 = this->groups; if(threadCreated) emit progressUpdated(step1Progress+step2Progress*s1/s2); } void NumberMoveProxy::updateProgress() { QMutexLocker locker(&mutex); this->progress++; if(counter>0) emit progressUpdated(this->progress); } void NumberMoveProxy::run() { //oldSourceModel->optimize(); emit progressMaxUpdated(100); if(this->oldSourceModel->getSegments().size()<=20) this->batchSize = 1; else this->batchSize = this->oldSourceModel->getSegments().size()/20; int pers = this->batchSize; int size = oldSourceModel->getSegments().size(); groups = SNCCore::getBatchGroups(size,pers); if(moveType==MoveByAll){ groups = 1; pers = this->oldSourceModel->getSegments().size() ; } QList movers; this->counter = groups; for(int j=0;jgetSegments().mid(j * pers,itemsToBatch); QList childNumbers; for(int k = j * pers; k < j * pers + itemsToBatch; k++ ) { childNumbers.append(oldSourceModel->getNumbers().at(k)); } NumberMove* move = new NumberMove(childSegments,childNumbers,moveType); move->setRange(this->range1,this->range2); move->setRegex(this->regexpList); QObject::connect(move,SIGNAL(childTaskFinished(QStringList,QList,QStringList,QList)), this,SLOT(onChildTaskFinished(QStringList,QList,QStringList,QList))); movers.append(move); move->start(); } threadCreated = true; while(!stop) { msleep(100); QMutexLocker locker(&mutex); if(counter==0) { for(int i=0;iabort(); movers[i]->wait(); delete movers[i]; } movers.clear(); appendModel(); emit progressUpdated(100); emit numberMoved(this->newSourceModel,this->newDestModel); break; } } } void NumberMoveProxy::appendModel() { newSourceModel = new NumberListModel(); newDestModel = new NumberListModel(); this->newSourceModel->setNumberList(this->sourceSegments,this->sourceNumbers); this->destSegments.append(this->oldDestModel->getSegments()); this->destNumbers.append(this->oldDestModel->getNumbers()); this->newDestModel->setNumberList(this->destSegments,this->destNumbers); if(moveType==MoveByAll&&oldDestModel->getCount()==0) { QList orderindex = oldSourceModel->getOrderIndex(); newDestModel->setOrderIndex(orderindex); } }