Russian Qt Forum
Ноябрь 23, 2024, 08:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Многопоточное осветление пикселей  (Прочитано 25545 раз)
AlphaGh0St
Гость
« Ответ #30 : Ноябрь 29, 2011, 22:42 »

У Вас программа не падает? ...хм...да в чём же дело...

В папке images, 2 изображения. Что на первом, что на втором программа вылетает.
Вот например, image1, 2 потока - и программа падает.
« Последнее редактирование: Ноябрь 30, 2011, 08:06 от AlphaGh0St » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Ноябрь 30, 2011, 11:27 »

У Вас программа не падает? ...хм...да в чём же дело...

В папке images, 2 изображения. Что на первом, что на втором программа вылетает.
Вот например, image1, 2 потока - и программа падает.
Давайте имеджи, посмотрим по-живому. У меня (пока) все норм.
Записан
AlphaGh0St
Гость
« Ответ #32 : Ноябрь 30, 2011, 14:27 »

...хм...странно получается...
вот картинки.

интересно разобраться, в чём же тут дело.
Записан
AlphaGh0St
Гость
« Ответ #33 : Ноябрь 30, 2011, 17:28 »

Как программа повела себя у Вас с этими картинками?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Декабрь 01, 2011, 13:12 »

Нормально повела Улыбающийся Единственное что я сделал - раскомментарил wait. По поводу workThread - он у Вас правильно вызывается, срабатывает QueuedConnection, но смысла немного, все равно надо "дождаться всех" и это время уже печатать (после wait). А если хотите иметь еще и время выполнения каждой, то проще сохранить в члене класса imageThread. Заодно присмотритесь к threadWorkDone, он объявлен с аргументом const QString & а для connect не так - во всяком случае проще сделать однообразно.
Записан
AlphaGh0St
Гость
« Ответ #35 : Декабрь 01, 2011, 21:51 »

Igors, представляете, под виндой компилировал и запускал программу, так она при работе более, чем в двух потоках вылетала. А сейчас, эксперимента ради, решил перекомпилировать и запустить под Линукс, и о чудо, всё заработало!
Программа прекрасно работает с разными изображениями и с разным количеством потоков.

Это, кончено, замечательно, но всё же не понятно, почему так произошло...

Igors, спасибо Вам за помощь!
Записан
daimon
Гость
« Ответ #36 : Январь 16, 2012, 16:33 »

под виндой на статике вылет, начиная уже с 2 потоков
« Последнее редактирование: Январь 16, 2012, 16:35 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Январь 16, 2012, 17:14 »

1) Проверьте что скомпилено как "Multithreaded DLL"
2) Закомментите отот emit workDone (он вообще "левый", зачем выводить имедж, если только одна нитка отстрелялась - ведь другие еще могут работать)
3) где-то t_Image калечится,  гляньте data, row, column и попробуйте отловить напр так

Код
C++ (Qt)
uchar * testScan = t_image.scanLine(0);  // до цикла
..
assert(t_image.scanLine(0) == testScan);  // в цикле перед setRgb
 
Записан
daimon
Гость
« Ответ #38 : Январь 17, 2012, 01:21 »

1) Проверьте что скомпилено как "Multithreaded DLL"
2) Закомментите отот emit workDone (он вообще "левый", зачем выводить имедж, если только одна нитка отстрелялась - ведь другие еще могут работать)
3) где-то t_Image калечится,  гляньте data, row, column и попробуйте отловить напр так

Код
C++ (Qt)
uchar * testScan = t_image.scanLine(0);  // до цикла
..
assert(t_image.scanLine(0) == testScan);  // в цикле перед setRgb
 

я специально ушел от рантайма, и скомпилил qt статикой и без рантайма
Код
C++ (Qt)
uchar * testScan = t_image->scanLine(0);  // до цикла
 
       for(int column = 0; column < t_image->width(); ++column){
           unsigned int &pix = data[column];
 
Q_ASSERT(t_image->scanLine(0) == testScan);  // в цикле перед setRgb
           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);
 
           // сохраняем изменённый пиксельurrentThreadId() << " &pix:" << &pix << " pix:" << pix << " || row:" << row << " col:" << column;
           pix = qRgba(color.red(), color.green(), color.blue(), qAlpha(pix));
        }
ассерт не вылетает, но приложение вылетает

проблема здесь  unsigned int &pix = data[column];
по картинке видно, что вылет идёт на втором потоке - осветлена половина
« Последнее редактирование: Январь 17, 2012, 01:38 от daimon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Январь 17, 2012, 13:34 »

- Перенесите (первый) testScan выше, до цикла по строкам
- отключите emit workDone, наиболее вероятно там порылась собака
- значения переменных на момент вылета (row, column, dat)?
Записан
daimon
Гость
« Ответ #40 : Январь 17, 2012, 14:51 »

- Перенесите (первый) testScan выше, до цикла по строкам
- отключите emit workDone, наиболее вероятно там порылась собака
- значения переменных на момент вылета (row, column, dat)?

если емит убираю, оно не выводит результат на экран
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Январь 17, 2012, 15:20 »

если емит убираю, оно не выводит результат на экран
Так выведите после того как все нитки отработали.

Ну а с вылетом-то что? Где Вы учились на партизана? Так не можнА  Улыбающийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #42 : Январь 18, 2012, 12:49 »

здесь бы в тему был как раз OpenCL!
Записан
lolbla2
Гость
« Ответ #43 : Февраль 25, 2012, 19:16 »

- Перенесите (первый) testScan выше, до цикла по строкам
- отключите emit workDone, наиболее вероятно там порылась собака
- значения переменных на момент вылета (row, column, dat)?

если емит убираю, оно не выводит результат на экран

Вопрос не по теме, но всё же: как Вам удалось компилить программу на Qt в MSVS ? Непонимающий
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #44 : Февраль 25, 2012, 20:00 »

Вопрос не по теме, но всё же: как Вам удалось компилить программу на Qt в MSVS ?
А в чём проблема?
Поддержка компиляторов MS VC 2005/2008/2010 сейчас идёт в составе Qt SDK.
Ну а если разрабатывать в студии хочется, то есть Qt VS Add-in для студий выше экспресса.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.177 секунд. Запросов: 23.