numberbuilderproxy.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "numberbuilderproxy.h"
  2. #include "importconsumer.h"
  3. #include "importproxy.h"
  4. NumberBuilderProxy::NumberBuilderProxy(NumberListModel *oldModel)
  5. {
  6. this->progress = 0;
  7. this->stop =false;
  8. this->oldModel = oldModel;
  9. }
  10. NumberBuilderProxy::~NumberBuilderProxy()
  11. {
  12. qDebug()<<"NumberBuilderProxy dead";
  13. }
  14. void NumberBuilderProxy::setBuildType(NumberBuildType buildType)
  15. {
  16. this->buildType = buildType;
  17. }
  18. void NumberBuilderProxy::setList(QStringList list)
  19. {
  20. this->list = list;
  21. }
  22. void NumberBuilderProxy::setRegList(QStringList regList)
  23. {
  24. this->regList = regList;
  25. }
  26. void NumberBuilderProxy::abort()
  27. {
  28. this->stop = true;
  29. }
  30. void NumberBuilderProxy::onChildTaskFinished(QStringList segments,QList<QStringList> numbers)
  31. {
  32. QMutexLocker locker(&mutex);
  33. this->counter--;
  34. this->progress++;
  35. this->segments.append(segments);
  36. this->numbers.append(numbers);
  37. if(counter>0)
  38. emit progressUpdated(this->progress);
  39. }
  40. void NumberBuilderProxy::run()
  41. {
  42. if(this->list.size()<=20)
  43. this->batchSize = 1;
  44. else
  45. this->batchSize = this->list.size()/20;
  46. int pers = this->batchSize;
  47. int size = this->list.size();
  48. int groups = SNCCore::getBatchGroups(size,pers);
  49. emit progressMaxUpdated(groups);
  50. this->counter = groups;
  51. for(int j=0;j<groups;j++)
  52. {
  53. int remainder = size - j * pers;
  54. int itemsToBatch = qMin(pers, remainder);
  55. QStringList childs = this->list.mid(j * pers,itemsToBatch);
  56. NumberBuilder *builder = new NumberBuilder(childs,buildType);
  57. builder->setRegList(this->regList);
  58. QObject::connect(builder,SIGNAL(childTaskFinished(QStringList,QList<QStringList>)),
  59. this,SLOT(onChildTaskFinished(QStringList,QList<QStringList>)));
  60. QObject::connect(this,SIGNAL(threadAborted()),builder,SLOT(abort()));
  61. builder->start();
  62. }
  63. while(!stop)
  64. {
  65. if(counter==0)
  66. {
  67. emit progressUpdated(this->progress);
  68. appendModel();
  69. emit numberBuilt(newModel);
  70. break;
  71. }
  72. }
  73. if(stop)
  74. emit threadAborted();
  75. deleteLater();
  76. }
  77. void NumberBuilderProxy::appendModel()
  78. {
  79. newModel = new NumberListModel();
  80. segments.append(oldModel->getSegments());
  81. numbers.append(oldModel->getNumbers());
  82. newModel->setNumberList(segments,numbers);
  83. }