MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mThread1 = new MyThread(this); mThread2 = new MyThread(this); // mThread1->setMessage("A"); // mThread2->setMessage("B"); // connect(mThread1,SIGNAL(NumberChanged(QString)),this,SLOT(onNumberChanged1(QString))); // connect(mThread2,SIGNAL(NumberChanged(QString)),this,SLOT(onNumberChanged2(QString))); connect(mThread1,SIGNAL(NumberChanged()),this,SLOT(onNumberChanged1())); connect(mThread2,SIGNAL(NumberChanged()),this,SLOT(onNumberChanged2())); }
void MyThread::run() { for(int i=tmpValue;i<10000;i++) { QMutex mutex; mutex.lock(); if(this->Stop) { tmpValue = i; break; } mutex.unlock(); emit NumberChanged(i); this->msleep(100); } }
/** Returns the best previous coordinate */ size_t* Graph::GetBestCoordinateAndCost(size_t* coordcurr) { if(isEndingCoordinate(coordcurr)) return NULL; GraphCoordinateList listPrevCoordinates(GetDimension()); size_t* bestprev = NULL; int curcost; PreviousCoordinates(listPrevCoordinates, coordcurr); GraphCoordinateListPosition i = listPrevCoordinates.GetBeginPosition(); GraphCoordinateListPosition ei = listPrevCoordinates.GetEndPosition(); int prevbestcost = -1; size_t bestnumchg = 0; bool isCorrectSubs = false; while(i != ei) { size_t* coordinate = listPrevCoordinates.GetAt(i); curcost = m_MapCost->GetCostFor(coordinate) + GetTransitionCost(coordcurr, coordinate); if(prevbestcost == -1) { prevbestcost = curcost; if(bestprev) delete [] bestprev; bestprev = coordinate; bool bToken1 = false; bool bToken2 = false; size_t c=0; while( (c != GetDimension()) && !bToken2) { if(coordcurr[c] != coordinate[c]) { if(!bToken1) bToken1 = true; else bToken2 = true; } ++c; } isCorrectSubs = bToken2; } else { if(curcost < prevbestcost) { prevbestcost = curcost; if(bestprev) delete [] bestprev; bestprev = coordinate; bool bToken1 = false; bool bToken2 = false; size_t c=0; while( (c != GetDimension()) && !bToken2) { if(coordcurr[c] != /*prevcurr*/coordinate[c]) { if(!bToken1) bToken1 = true; else bToken2 = true; } ++c; } isCorrectSubs = bToken2; } else if( (m_HypRefStatus == 1) && (curcost == prevbestcost) && !isCorrectSubs) { bool bToken1 = false; bool bToken2 = false; size_t c=0; while( (c != GetDimension()) && !bToken2) { if(coordcurr[c] != coordinate[c]) { if(!bToken1) bToken1 = true; else bToken2 = true; } ++c; } if(bToken2) { prevbestcost = curcost; if(bestprev) delete [] bestprev; bestprev = coordinate; isCorrectSubs = bToken2; } } else if( (curcost == prevbestcost) && (m_HypRefStatus != 1) ) { size_t numchg = NumberChanged(coordcurr, coordinate); if(numchg > bestnumchg) { prevbestcost = curcost; if(bestprev) delete [] bestprev; bestprev = coordinate; bestnumchg = numchg; } } } listPrevCoordinates.NextPosition(i); if(coordinate && (bestprev != coordinate)) delete [] coordinate; } // Start cleaning memory listPrevCoordinates.RemoveAll(); // End cleaning memory return bestprev; }
bool Graph::ValidateTransitionInsertionDeletion(size_t* coordcurr, size_t* coordprev) { if(!m_bPruneOptimization && !m_bWordOptimization) return true; Token* pToken; size_t nrbchanged = NumberChanged(coordcurr, coordprev); if( (nrbchanged == 1) && m_bPruneOptimization )// Insertion or Deletion { size_t chgdim = 0; while( (chgdim<GetDimension()) && (coordcurr[chgdim] == coordprev[chgdim]) ) ++chgdim; pToken = m_TabVecHypRef[chgdim][coordcurr[chgdim]]; int currentchgbegin; int currentchgend; if(pToken) { currentchgbegin = pToken->GetStartTime(); if(currentchgbegin < 0) { currentchgbegin = pToken->GetParentSegment()->GetStartTime(); if(currentchgbegin < 0) return true; } else return true; currentchgend = pToken->GetEndTime(); if(currentchgend < 0) { currentchgend = pToken->GetParentSegment()->GetEndTime(); if(currentchgend < 0) return true; } else return true; } else return true; int currentstaybegin; int currentstayend; for(size_t i=0; i<GetDimension(); ++i) { if(i != chgdim) { pToken = m_TabVecHypRef[i][coordcurr[i]]; if(pToken) { currentstaybegin = pToken->GetStartTime(); if(currentstaybegin < 0) { currentstaybegin = pToken->GetParentSegment()->GetStartTime(); if(currentstaybegin < 0) return true; } currentstayend = pToken->GetEndTime(); if(currentstayend < 0) { currentstayend = pToken->GetParentSegment()->GetEndTime(); if(currentstayend < 0) return true; } } else return true; if(currentchgbegin < currentstaybegin) { int gap = 0; if(currentchgend < currentstaybegin) // Change before Stay { gap = currentstaybegin - currentchgend; } else if(currentstayend < currentchgbegin) // Stay before Change { gap = currentchgbegin - currentstayend; } if(gap > m_PruneOptimizationThreshold) return false; } } } return true; } else if( (nrbchanged == 2) && m_bWordOptimization )//Subsitution or Correct { size_t coord1 = 0; size_t coord2 = 0; bool bcoord1 = false; for(size_t i=0; i<GetDimension(); ++i) { if(coordcurr[i] != coordprev[i]) { if(!bcoord1) { bcoord1 = true; coord1 = i; } else coord2 = i; } } int start1 = m_TabVecHypRef[coord1][coordcurr[coord1]]->GetStartTime(); if(start1 < 0) start1 = m_TabVecHypRef[coord1][coordcurr[coord1]]->GetParentSegment()->GetStartTime(); int start2 = m_TabVecHypRef[coord2][coordcurr[coord2]]->GetStartTime(); if(start2 < 0) start2 = m_TabVecHypRef[coord2][coordcurr[coord2]]->GetParentSegment()->GetStartTime(); int end1 = m_TabVecHypRef[coord1][coordcurr[coord1]]->GetEndTime(); if(end1 < 0) end1 = m_TabVecHypRef[coord1][coordcurr[coord1]]->GetParentSegment()->GetEndTime(); int end2 = m_TabVecHypRef[coord2][coordcurr[coord2]]->GetEndTime(); if(end2 < 0) end2 = m_TabVecHypRef[coord2][coordcurr[coord2]]->GetParentSegment()->GetEndTime(); if( (start1 < 0) || (start2 < 0) || (end1 < 0) || (end2 < 0) ) return true; int gap; if(end1 < start2) // 1 before 2 { gap = start2 - end1; } else if(end2 < start1) // 2 before 1 { gap = start1 - end2; } else { gap = 0; } return(gap <= m_WordOptimizationThreshold); } return true; }