class ImageThread : public QThread { ... };
for(int i = 0; i < threadsLimit; i++) imgThread[i].run();
ID: 0xc10
ID: 0xc10 ID: 0xc10
ID: 0xc10 ID: 0xc10 ID: 0xc10
for(int i = 0; i < threadsLimit; i++) imgThread[i].start();
void ImageThread::run(){ QSize countOfPixels = t_image->size(); // кол-во пикселей QRgb rgb; QColor color; int h = 0, s = 0, v = 0; time.start(); // замеряем время выполнения // проходим по всем пикселям for(int i = 0; i < countOfPixels.width(); i++){ for(int j = 0; j < countOfPixels.height(); j++){ // берём текущий пиксель t_mutexRead.lock(); rgb = t_image->pixel(i, j); t_mutexRead.unlock(); // увеличиваем яркость color.setRgb(rgb); color.getHsv(&h, &s, &v); v += t_brightnessValue; // значение, на которое надо увеличить яркость color.setHsv(h, s, v); // сохраняем изменённый пиксель t_mutexWrite.lock(); t_image->setPixel(i, j, color.rgb()); t_mutexWrite.unlock(); } } // сообщаем главному классу, что работа завершена и время выполнения. emit workDone("MS:" + QString("%1").arg(time.elapsed()));}
Видим, что поток с ID 0xcd8 вошёл в метод, вошёл в первый цикл и во второй.THREAD BEGIN | ID: 0xcd8 ENTER IN 1ST LOOP | ID: 0xcd8 ENTER IN 2ND LOOP | ID: 0xcd8 Далее начинается выполнение:BLOCK MUTEX AND READ | ID: 0xcd8 CHANGE DATA | ID: 0xcd8 BLOCK MUTEX AND WRITE | ID: 0xcd8 И так много-много раз......И в конце:BLOCK MUTEX AND READ | ID: 0xcd8 CHANGE DATA | ID: 0xcd8 И программа вылетела
C++ (Qt)// члены класса ImageThread// mSelfIndex - индекс нитки// mTeamCount - число ниток-обработчиковvoid ImageThread::run(){ QColor color; int h, s, v; time.start(); // замеряем время выполнения int numRow = t_image.height() / mTeamCount; // число строк для обработки int begRow = numRow * mSelfIndex; // первая стока int endRow = (mSelfIndex == mTeamCount - 1) ? t_image.height() : (begRow + numRow); // предел for(int row = begRow; row < endRow; ++row) { unsigned int * data = (unsigned int *) t_image.scanLine(row); for(int col = 0; col < t_image.width(); ++col){ unsigned int & pix = data[col]; color.setRgb(qRed(pix), qGreen(pix), qBlue(pix)); color.getHsv(&h, &s, &v); v += t_brightnessValue; // значение, на которое надо увеличить яркость v = qMin(v, 255); color.setHsv(h, s, v); // сохраняем изменённый пиксель pix = qRgba(color.red(), color.green(), color.blue(), qAlpha(pix)); } } // сообщаем главному классу, что работа завершена и время выполнения. emit workDone("MS:" + QString("%1").arg(time.elapsed()));}
// mSelfIndex - индекс нитки// mTeamCount - число ниток-обработчиковint numRow = t_image.height() / mTeamCount; // число строк для обработкиint begRow = numRow * mSelfIndex; // первая стока int endRow = (mSelfIndex == mTeamCount - 1) ? t_image.height() : (begRow + numRow); // предел
C++ (Qt)ImageThread::ImageThread( int iIndex, int iCount ) : mSelfIndex(iIndex), mTeamCount(iCount){ ...} // создаем все ниткиQVector <ImageThread *> theThread;for (int i = 0; i < numThreads; ++i) theThread.push_back(new ImageThread(i, numThreads)); // удаляем (после того как они отработали)for (int i = 0; i < numThreads; ++i) // ну или пресловутое qDeleteAll delete theThread[i]; theThread.clear();