![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
RazrFalcon |
![]()
Сообщение
#1
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Пример:
Раскрывающийся текст
Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match. Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая. |
|
|
Sokoloff |
![]()
Сообщение
#2
|
Участник ![]() ![]() Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: ![]() ![]() ![]() |
Пример: Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match. Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая. Из твоего объяснения ничего не понятно. Почитай это может подойдет. |
|
|
Iron Bug |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая. а в чём, собственно, проблема-то? у тебя какая-то сентенция по поводу того, что ты не знаешь, вышла. ты пробовал для начала выписать условия задачи, с формализацией? в конце концов, представь, что это не задачи, а картошка и есть два человека, которые её должны почистить. вроде никакой особой алгоритмической сложности в такой задаче нет ![]() |
|
|
RazrFalcon |
![]()
Сообщение
#4
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
В этом и проблема, я не могу понять логику работы.
Проблема в том, что мне нужно передать значения в функцию которая в потоке находится. И еще, если у меня потоки создаются изначально, то там что должны бить просто while постоянно? У меня есть цикл основной, в нем циклично посылаться должны значения двум потокам. Пример: Есть 20 изображений, 10 изначальных и 10 измененных. У меня есть цикл который сравнивает эти изображения. То есть берем 1-е изначальное и сравниваем с 10 измененными, и находим нужное. Потом второе исходное снова с 10 сравниваем и тд. Я хочу распараллелить (так как долго обрабатываются изображения), к примеру четные исходные первый поток обрабатывает, а нечетные второй. Ну или первые 5-ть - первый, остальные пять - второй. Сообщение отредактировал RazrFalcon - 7.12.2010, 15:56 |
|
|
Алексей1153 |
![]()
Сообщение
#5
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
RazrFalcon, если сравнений нужно производить больше, чем у тебя ядер процессора, то распараллеливать тут нечего - будет только медленнее. Сравнивай в одном отдельном потоке по очереди
то ли дело, если бы было 4 ядра и одно сравнение: 1 ядро - главный поток, 3 потока в 3 ядрах: каждый свою треть картинки шмонает. Вот тогда выгода в скорости налицо ![]() |
|
|
RazrFalcon |
![]()
Сообщение
#6
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Ну так, у меня 2-а ядра. Каждое свою половину сравнивает. Как тут производительность ухудшится?
PS жду ваше 1000-е сообщение ![]() |
|
|
Алексей1153 |
![]()
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
![]() ![]() Цитата к примеру четные исходные первый поток обрабатывает, а нечетные второй где тут про половину изображдения то ? )) Нету про половину. Говоришь про целые картинки же |
|
|
RazrFalcon |
![]()
Сообщение
#8
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Я имел в виду половину изображениЙ (пол. количества общего)
Ну а логику в принципе понял. То есть если у меня 2-а ядра, а создаю 3-и потока, 1-й основной, который посылает 2-м обрабатывающим задания, то это только ухудшит производительность. Я так понимаю лучше всего это один(главный) управляющий и второй обрабатывающий? |
|
|
Алексей1153 |
![]()
Сообщение
#9
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
ну, если во время вычислений основной поток ленится, то, для красоты/удобства, вполне можно запустить два одинаковых бурных потока. Главное, чтобы они делали воистину распараллеливание, а не последовательное решение задачи, с которой и один поток бы справился, да ещё и побыстрее бы это сделал
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
RazrFalcon |
![]()
Сообщение
#11
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Я так понимаю, надо просто пробовать разные варианты, и замерять общее время. Ну а потом уже выбирать лучший для данной задачи вариант?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
вообще второй поток, кроме первого нужен только для того чтобы первый не замирал при длительных операциях.
Исключения составляют если ты жёстко пишешь под конкретную железку, например с 4 процами. А иначе пользователь запустит на однопроцессорной машине твою программу и увидит её заторможенность. |
|
|
RazrFalcon |
![]()
Сообщение
#13
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Вроде понял, в основном запуска обработку половины изображений всех, и одновременно стартую 2-й поток который обрабатывает вторую половину.
Результат на лицо: 1-н поток 36 сек 2-а потока 20 сек ~50% прирост, как и читал, что прирост будет не в 2-а раза а в 1.5 PS: у меня вывод в консоль через qDebug, вроде выводит по очереди, с этим вообще могут быть проблемы? Так как что запись в один файл не лучшая идея. |
|
|
Алексей1153 |
![]()
Сообщение
#14
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
и эти два вторичных буду по очереди работать + затраты на их переключение это смотря как распределена нагрузка на потоки. в задаче, по ходу, основной поток почти что спит, а рабочие потоки выполняют какие-то вычисления. это существенно ускорит обработку в случае, если не нужна синхронизация приёма готовых данных (складываем их куда-то, по завершению обрабатываем полученный общий результат). и тут нельзя разделить на "чётное-нечётное". в реальности, кроме этой задачи проц выполняет дофига всего прочего и нет смысла выдавать задачи по очереди. просто очередную задачу получает первый из освободившихся потоков. тогда будет эффективно. логичнее сделать какие-то сигналы о том, что поток освободился. по получению сигнала, главный поток выдаёт свободному потоку очередную задачу. а сам собирает результаты. но это, опять же, если не нужно соблюдать FIFO при обработке заданий. а если нужно, то тогда распараллеливание будет менее эффективно и нужно будет ставить какую-то доп проверку на "порядковые номера" готовых заданий. Сообщение отредактировал Iron Bug - 9.12.2010, 9:00 |
|
|
RazrFalcon |
![]()
Сообщение
#16
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Как правильно определить что потоки завершились, а то сыпятся ошибки вида
Цитата QThread destroyed while thread is still running Рабочий вариант пока только такой:
а в конце main
|
|
|
BRE |
![]()
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
RazrFalcon, попробуй вначале разобраться и поэкспериментировать с простыми потоками.
Сделай класс Thread, который будет выводить на консоль один символ нужное количество раз, символ и количество итераций должно передаваться в параметрах конструктора объекта. Создай один, два, три, ... экземпляра этого объекта. Разберись когда создается и завершается проект. Добавь к нему возможность преждевременного завершения потока. Потом попробуй добавить очереди, из которых потоки будут выбирать задания (символ/количество итераций) и выполнять их и т.д. Короче постепенно. Потом, ты сам увидишь как туда добавить свою задачу. А то пока, по твоему коду кажется, что ты не особо понимаешь как это все работает. Там ничего сложного нет, просто нужно разобраться на простых примерах. ![]() |
|
|
RazrFalcon |
![]()
Сообщение
#18
|
![]() Zombie Mod ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: ![]() ![]() ![]() |
Да просто я до этого запускал пол обработки в главном потоке, а вторую половину в дополнительном.
И когда понадобилось что бы дополнительный работал чуть дольше, вылезла такая ошибка. Я понимаю, что просто главный завершился уже, и убивает дополнительный. Просто когда сделал два дополнительных потока, а главный только запускал их, то прога рушилась сразу, мне надо как то не дать завершатся главному потоку пока остальные не закончат работу. А то что я написал тоже криво работает, и проц еще больше жрет ![]() Я понимаю что потоки - это не на один день, но все равно. Что то с isFinished () |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 8.6.2025, 23:29 |