![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
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 () |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.6.2025, 15:52 |