importproxy.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "importproxy.h"
  2. ImportProxy::ImportProxy(NumberListModel *oldModel)
  3. {
  4. this->stop =false;
  5. this->oldModel = oldModel;
  6. this->batchSize = 1;
  7. this->resAvailable = 0;
  8. this->counter = 0;
  9. this->readFinished = false;
  10. this->all_file_size = 0;
  11. this->current_file_size = 0;
  12. this->step1Progress = 30;
  13. this->step2Progress = 70;
  14. this->threadAlive = 5;
  15. this->threadDead = 0;
  16. this->bufferAppendedTimes = 0;
  17. this->bufferTakedTimes = 0;
  18. }
  19. ImportProxy::~ImportProxy()
  20. {
  21. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  22. <<"ImportProxy Destroyed.";
  23. }
  24. void ImportProxy::setFetchList(QStringList list)
  25. {
  26. this->fetchList = list;
  27. }
  28. void ImportProxy::abort()
  29. {
  30. this->stop = true;
  31. }
  32. void ImportProxy::onChildTaskFinished(QStringList segments,QList<QStringList> numbers)
  33. {
  34. QMutexLocker locker(&mutex);
  35. if(segments.size()!=0)
  36. {
  37. this->segments.append(segments);
  38. this->numbers.append(numbers);
  39. }
  40. this->counter++;
  41. if(readFinished)
  42. {
  43. double s1 = counter;
  44. double s2 = resAvailable;
  45. emit progressUpdated(step1Progress+step2Progress*s1/s2);
  46. //qDebug()<<step1Progress+step2Progress*s1/s2;
  47. }
  48. }
  49. void ImportProxy::onBufferAppended()
  50. {
  51. QMutexLocker locker(&mutex);
  52. bufferAppendedTimes++;
  53. }
  54. void ImportProxy::onBufferTaked()
  55. {
  56. QMutexLocker locker(&mutex);
  57. bufferTakedTimes++;
  58. }
  59. void ImportProxy::onProduced(int strSize)
  60. {
  61. this->resAvailable++;
  62. this->current_file_size += strSize;
  63. double s1 = this->current_file_size;
  64. double s2 = this->all_file_size;
  65. emit progressUpdated(step1Progress*s1/s2);
  66. }
  67. void ImportProxy::onThreadDestroy()
  68. {
  69. QMutexLocker locker(&mutex);
  70. this->threadDead++;
  71. }
  72. void ImportProxy::onProducerFinished()
  73. {
  74. readFinished = true;
  75. emit progressUpdated(step1Progress);
  76. }
  77. void ImportProxy::run()
  78. {
  79. emit progressMaxUpdated(100);
  80. mutex2 = new QMutex();
  81. buffer = new QList<QStringList>();
  82. setFetchMaxSize();
  83. ImportProducer *producer = new ImportProducer(this->fetchList,buffer,mutex2);
  84. producer->setBuildType(this->buildType);
  85. connect(producer,SIGNAL(produced(int )),this,SLOT(onProduced(int )));
  86. connect(producer,SIGNAL(producerFinished()),this,SLOT(onProducerFinished()));
  87. connect(producer,SIGNAL(bufferAppended()),this,SLOT(onBufferAppended()));
  88. producer->start();
  89. QList<ImportConsumer*> consumers;
  90. for(int i=0;i<5;i++)
  91. {
  92. ImportConsumer *consumer = new ImportConsumer(buffer,mutex2);
  93. consumer->setBuildType(this->buildType);
  94. consumers.append(consumer);
  95. connect(consumer,SIGNAL(threadDestroy()),this,SLOT(onThreadDestroy()));
  96. connect(consumer,SIGNAL(childTaskFinished(QStringList,QList<QStringList>)),
  97. this,SLOT(onChildTaskFinished(QStringList,QList<QStringList>)));
  98. connect(consumer,SIGNAL(bufferTaked()),this,SLOT(onBufferTaked()));
  99. consumer->start();
  100. }
  101. while(!stop)
  102. {
  103. msleep(100);
  104. if(producer->isFinished()&&readFinished)//文件读取完成
  105. {
  106. //if(resAvailable == counter && resAvailable!=0)//号码处理完成
  107. if(bufferAppendedTimes==bufferTakedTimes)
  108. {
  109. for(int i=0;i<consumers.size();i++)
  110. {
  111. consumers[i]->abort();
  112. }
  113. for(int i=0;i<consumers.size();i++)
  114. {
  115. consumers[i]->wait();
  116. }
  117. for(int i=0;i<consumers.size();i++)
  118. {
  119. delete consumers[i];
  120. }
  121. delete this->mutex2;
  122. appendModel();
  123. emit progressMaxUpdated(1);
  124. emit progressUpdated(1);
  125. emit numberBuilt(newModel);
  126. break;
  127. }
  128. }
  129. }
  130. producer->wait();
  131. delete producer;
  132. }
  133. void ImportProxy::appendModel()
  134. {
  135. newModel = new NumberListModel();
  136. if(oldModel){
  137. segments.append(oldModel->getSegments());
  138. numbers.append(oldModel->getNumbers());
  139. oldModel->clear();
  140. }
  141. newModel->setNumberList(segments,numbers);
  142. }
  143. void ImportProxy::setBuildType(NumberBuildType buildType)
  144. {
  145. this->buildType = buildType;
  146. if(this->buildType==NumberFromFileImport)
  147. {
  148. this->step1Progress = 95;
  149. this->step2Progress = 5;
  150. }
  151. else if(this->buildType==NumberFromFileExtract || this->buildType==NumberFromContent)
  152. {
  153. this->step1Progress = 5;
  154. this->step2Progress = 95;
  155. }
  156. }
  157. void ImportProxy::setFetchMaxSize()
  158. {
  159. if(this->buildType==NumberFromFileImport || this->buildType == NumberFromFileExtract)
  160. {
  161. for(int i=0;i<this->fetchList.size();i++)
  162. {
  163. QFileInfo fileinfo(this->fetchList.at(i));
  164. this->all_file_size+=fileinfo.size();
  165. }
  166. }
  167. else if(this->buildType==NumberFromContent)
  168. {
  169. for(int i=0;i<this->fetchList.size();i++)
  170. {
  171. this->all_file_size += this->fetchList.at(i).size();
  172. }
  173. }
  174. }