numbermoveproxy.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "numbermoveproxy.h"
  2. NumberMoveProxy::NumberMoveProxy(NumberListModel *oldSourceModel, NumberListModel *oldDestModel)
  3. {
  4. this->progress = 0;
  5. this->stop = false;
  6. this->oldSourceModel = oldSourceModel;
  7. this->oldDestModel = oldDestModel;
  8. this->batchSize = 100;
  9. this->step1Progress = 2;
  10. this->step2Progress = 98;
  11. this->threadCreated = false;
  12. }
  13. NumberMoveProxy::~NumberMoveProxy()
  14. {
  15. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  16. <<"NumberMoveProxy Destroyed.";
  17. }
  18. void NumberMoveProxy::setMoveType(NumberMoveType moveType)
  19. {
  20. this->moveType = moveType;
  21. }
  22. void NumberMoveProxy::setRegexpList(QList<QRegExp> regexpList)
  23. {
  24. this->regexpList = regexpList;
  25. }
  26. void NumberMoveProxy::setBatchSize(int batchSize)
  27. {
  28. this->batchSize = batchSize;
  29. }
  30. void NumberMoveProxy::setRange(QString range1, QString range2)
  31. {
  32. this->range1 = range1;
  33. this->range2 = range2;
  34. }
  35. void NumberMoveProxy::abort()
  36. {
  37. this->stop = true;
  38. }
  39. void NumberMoveProxy::onChildTaskFinished(QStringList sourceSegments, QList<QStringList> sourceNumbers,
  40. QStringList destSegments, QList<QStringList> destNumbers)
  41. {
  42. QMutexLocker locker(&mutex);
  43. this->counter--;
  44. this->progress++;
  45. this->sourceSegments.append(sourceSegments);
  46. this->sourceNumbers.append(sourceNumbers);
  47. this->destSegments.append(destSegments);
  48. this->destNumbers.append(destNumbers);
  49. double s1 = this->progress;
  50. double s2 = this->groups;
  51. if(threadCreated)
  52. emit progressUpdated(step1Progress+step2Progress*s1/s2);
  53. }
  54. void NumberMoveProxy::updateProgress()
  55. {
  56. QMutexLocker locker(&mutex);
  57. this->progress++;
  58. if(counter>0)
  59. emit progressUpdated(this->progress);
  60. }
  61. void NumberMoveProxy::run()
  62. {
  63. //oldSourceModel->optimize();
  64. emit progressMaxUpdated(100);
  65. if(this->oldSourceModel->getSegments().size()<=20)
  66. this->batchSize = 1;
  67. else
  68. this->batchSize = this->oldSourceModel->getSegments().size()/20;
  69. int pers = this->batchSize;
  70. int size = oldSourceModel->getSegments().size();
  71. groups = SNCCore::getBatchGroups(size,pers);
  72. if(moveType==MoveByAll){
  73. groups = 1;
  74. pers = this->oldSourceModel->getSegments().size() ;
  75. }
  76. QList<NumberMove*> movers;
  77. this->counter = groups;
  78. for(int j=0;j<groups;j++)
  79. {
  80. double s1 = j+1;
  81. double s2 = groups;
  82. emit progressUpdated(step1Progress*s1/s2);
  83. int remainder = size - j * pers;
  84. int itemsToBatch = qMin(pers, remainder);
  85. QStringList childSegments = oldSourceModel->getSegments().mid(j * pers,itemsToBatch);
  86. QList<QStringList> childNumbers;
  87. for(int k = j * pers; k < j * pers + itemsToBatch; k++ )
  88. {
  89. childNumbers.append(oldSourceModel->getNumbers().at(k));
  90. }
  91. NumberMove* move = new NumberMove(childSegments,childNumbers,moveType);
  92. move->setRange(this->range1,this->range2);
  93. move->setRegex(this->regexpList);
  94. QObject::connect(move,SIGNAL(childTaskFinished(QStringList,QList<QStringList>,QStringList,QList<QStringList>)),
  95. this,SLOT(onChildTaskFinished(QStringList,QList<QStringList>,QStringList,QList<QStringList>)));
  96. movers.append(move);
  97. move->start();
  98. }
  99. threadCreated = true;
  100. while(!stop)
  101. {
  102. msleep(100);
  103. QMutexLocker locker(&mutex);
  104. if(counter==0)
  105. {
  106. for(int i=0;i<movers.size();i++)
  107. {
  108. movers[i]->abort();
  109. movers[i]->wait();
  110. delete movers[i];
  111. }
  112. movers.clear();
  113. appendModel();
  114. emit progressUpdated(100);
  115. emit numberMoved(this->newSourceModel,this->newDestModel);
  116. break;
  117. }
  118. }
  119. }
  120. void NumberMoveProxy::appendModel()
  121. {
  122. newSourceModel = new NumberListModel();
  123. newDestModel = new NumberListModel();
  124. this->newSourceModel->setNumberList(this->sourceSegments,this->sourceNumbers);
  125. this->destSegments.append(this->oldDestModel->getSegments());
  126. this->destNumbers.append(this->oldDestModel->getNumbers());
  127. this->newDestModel->setNumberList(this->destSegments,this->destNumbers);
  128. if(moveType==MoveByAll&&oldDestModel->getCount()==0)
  129. {
  130. QList<int> orderindex = oldSourceModel->getOrderIndex();
  131. newDestModel->setOrderIndex(orderindex);
  132. }
  133. }