thread begin # 0xf60 team count : 1 self index : 0 thread done # 0xf60
thread begin # 0xc2c thread begin # 0xa14 team count : 2 team count : 2 self index : 0 self index : 1 thread done # 0xc2c
thread begin # 0x208 thread begin # 0xe18 team count : 3 thread begin # 0xf84 team count : 3 self index : 0 team count : 3 self index : 1 self index : 2 thread done # 0x208
thread begin # 0x5fc thread begin # 0x8d0 team count : 4 team count : 4 thread begin # 0x9cc self index : 0 self index : 1 thread begin # 0x4f8 team count : 4 team count : 4 self index : 2 self index : 3 thread done # 0x5fc
C++ (Qt)#define NUM_THREAD 4 // просто чтобы попроще // здесь загружаем исходный t_image // объявляем массив нитокImageThread theThread[NUM_THREAD]; // стартуем массив нитокfor (int i = 0; i < NUM_THREAD; ++i) { theThread[i].mSelfIndex = i; theThread[i].mTeamCount = NUM_THREAD; theThread[i].start();} // ждем пока все сделаноfor (int i = 0; i < NUM_THREAD; ++i) theThread[i].wait(); // здесь выводим "осветленный" t_image
color.setRgb(qRed(pix), qGreen(pix), qBlue(pix));
pix = qRgba(color.red(), color.green(), color.blue(), qAlpha(pix));
void ImageThread::run(){ QColor color; int h = 0, s = 0, v = 0; time.start(); // замеряем время выполнения int numRow = t_image->height() / t_TeamCount; // число строк для обработки int beginRow = numRow * t_SelfIndex; // первая стока int endRow = (t_SelfIndex == t_TeamCount - 1) ? t_image->height() : (beginRow + numRow); // предел for(int row = beginRow; row < endRow; ++row){ t_mutexRead.lock(); unsigned int *data = (unsigned int *) t_image->scanLine(row); t_mutexRead.unlock(); for(int column = 0; column < t_image->width(); ++column){ t_mutexRead.lock(); unsigned int &pix = data[column]; t_mutexRead.unlock(); 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); // сохраняем изменённый пиксель t_mutexWrite.lock(); pix = qRgba(color.red(), color.green(), color.blue(), qAlpha(pix)); t_mutexWrite.unlock(); } } // сообщаем главному классу, что работа завершена и время выполнения. emit workDone("Ms: " + QString("%1").arg(time.elapsed()));}
// кол-во потоков int threadsLimit = ui->threadsSpinBox->text().toInt(); // устанавливаем значения для потоков (это всё статические данные) imgThread[0].setBrightnessValue(ui->valueSpinBox->text().toInt()); // уровень яркости imgThread[0].setImagePointer(&image); // указатель на картинку imgThread[0].setTeamCount(threadsLimit); // всего потоков // запускаем потоки for(int i = 0; i < threadsLimit; i++){ imgThread[i].setSelfIndex(i); imgThread[i].start(); }
C++ (Qt) // устанавливаем значения для потоков (это всё статические данные) imgThread[0].setBrightnessValue(ui->valueSpinBox->text().toInt()); // уровень яркости imgThread[0].setImagePointer(&image); // указатель на картинку imgThread[0].setTeamCount(threadsLimit); // всего потоков
C++ (Qt) ImageThread::setBrightnessValue(ui->valueSpinBox->text().toInt()); ImageThread::setImagePointer(&image); ImageThread::setTeamCount(threadsLimit);
C++ (Qt)printf("thread %p. image = %p (%d x %d) t_TeamCount = %d, t_SelfIndex = %d. begRow = %d, endRow = %d\n".// здесь переменные
qDebug() << "#" << this->currentThreadId() << " img:" << &t_image << " team_count:" << t_TeamCount << " self_index:" << t_SelfIndex << " row:" << row << " col:" << column << " begRow:" << beginRow << " endRow:" << endRow;
# 0x928 img: 0x41602c team_count: 2 self_index: 0 row: 0 col: 0 begRow: 0 endRow: 97 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 0 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 1 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 2 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 3 begRow: 97 endRow: 194 ...# 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 154 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 155 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 156 begRow: 97 endRow: 194 ...# 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 100 col: 15 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 100 col: 16 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 100 col: 17 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 100 col: 18 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 100 col: 19 begRow: 97 endRow: 194 Программа неожиданно завершилась.
# 0x220 img: 0x41602c team_count: 2 self_index: 0 row: 0 col: 0 begRow: 0 endRow: 302 # 0x220 img: 0x41602c team_count: 2 self_index: 0 row: 0 col: 1 begRow: 0 endRow: 302 # 0x220 img: 0x41602c team_count: 2 self_index: 0 row: 0 col: 2 begRow: 0 endRow: 302 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 0 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 1 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 2 begRow: 302 endRow: 604 ...# 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 345 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 346 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 347 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 348 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 349 begRow: 302 endRow: 604 ...# 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 628 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 629 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 630 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 631 begRow: 302 endRow: 604 # 0xb74 img: 0x41602c team_count: 2 self_index: 1 row: 302 col: 632 begRow: 302 endRow: 604 Программа неожиданно завершилась.
# 0x928 img: 0x41602c team_count: 2 self_index: 0 row: 0 col: 0 begRow: 0 endRow: 97 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 0 begRow: 97 endRow: 194 # 0x21c img: 0x41602c team_count: 2 self_index: 1 row: 97 col: 1 begRow: 97 endRow: 194 ...
for(int row = beginRow; row < endRow; ++row){ // первый цикл ... for(int column = 0; column < t_image->width(); ++column){ // второй (вложенный) ... // вот ТУТ во втором цикле и вывожу отладочную информацию } }
# 0xfc8 img: 0x41602c team_count: 2 self_index: 1 row: 302 begRow: 302 endRow: 604 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 0 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 1 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 2 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 3 begRow: 0 endRow: 302 ...# 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 129 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 130 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 131 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 132 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 133 begRow: 0 endRow: 302 ...# 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 297 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 298 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 299 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 300 begRow: 0 endRow: 302 # 0xcc0 img: 0x41602c team_count: 2 self_index: 0 row: 301 begRow: 0 endRow: 302 Программа неожиданно завершилась.