crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 14:23
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пример:
Раскрывающийся текст
#include <QtCore/QCoreApplication>
#include <QtDebug>
#include <QThread>

class MyThread : public QThread
 {
 public:
     void run();
 };

class MyThread2 : public QThread
 {
 public:
     void run();
 };

int match(переменные)
{
    for (int j=0; j<10; j++)
    {

    }
    return n;
}

int main()
{
    MyThread th;
    MyThread2 th2;
    th.start();
    th2.start();
    for (int i=0; i<10; i+=2)
    {
        //тут я должен передать i=0 в один поток, а i=1 во второй.
        и получить обратно
    }
    return 0;
}

void MyThread::run()
{
    match(переменные);
}

void MyThread2::run()
{
    match(переменные);
}


Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match.
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 7.12.2010, 15:28
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 7.12.2010, 14:23) *
Пример:
Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match.
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.


Из твоего объяснения ничего не понятно. Почитай это может подойдет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 7.12.2010, 15:34
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(RazrFalcon @ 7.12.2010, 16:23) *
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.

а в чём, собственно, проблема-то? у тебя какая-то сентенция по поводу того, что ты не знаешь, вышла.
ты пробовал для начала выписать условия задачи, с формализацией?
в конце концов, представь, что это не задачи, а картошка и есть два человека, которые её должны почистить. вроде никакой особой алгоритмической сложности в такой задаче нет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 15:55
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


В этом и проблема, я не могу понять логику работы.
Проблема в том, что мне нужно передать значения в функцию которая в потоке находится.
И еще, если у меня потоки создаются изначально, то там что должны бить просто while постоянно?
У меня есть цикл основной, в нем циклично посылаться должны значения двум потокам.

Пример:
Есть 20 изображений, 10 изначальных и 10 измененных. У меня есть цикл который сравнивает эти изображения. То есть берем 1-е изначальное и сравниваем с 10 измененными, и находим нужное. Потом второе исходное снова с 10 сравниваем и тд.
Я хочу распараллелить (так как долго обрабатываются изображения), к примеру четные исходные первый поток обрабатывает, а нечетные второй. Ну или первые 5-ть - первый, остальные пять - второй.

Сообщение отредактировал RazrFalcon - 7.12.2010, 15:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.12.2010, 22:13
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, если сравнений нужно производить больше, чем у тебя ядер процессора, то распараллеливать тут нечего - будет только медленнее. Сравнивай в одном отдельном потоке по очереди

то ли дело, если бы было 4 ядра и одно сравнение: 1 ядро - главный поток, 3 потока в 3 ядрах: каждый свою треть картинки шмонает. Вот тогда выгода в скорости налицо :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 22:43
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну так, у меня 2-а ядра. Каждое свою половину сравнивает. Как тут производительность ухудшится?
PS жду ваше 1000-е сообщение :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.12.2010, 19:38
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


:p :D

Цитата
к примеру четные исходные первый поток обрабатывает, а нечетные второй

где тут про половину изображдения то ? )) Нету про половину. Говоришь про целые картинки же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2010, 19:54
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я имел в виду половину изображениЙ (пол. количества общего)
Ну а логику в принципе понял.
То есть если у меня 2-а ядра, а создаю 3-и потока, 1-й основной, который посылает 2-м обрабатывающим задания, то это только ухудшит производительность.

Я так понимаю лучше всего это один(главный) управляющий и второй обрабатывающий?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.12.2010, 20:18
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ну, если во время вычислений основной поток ленится, то, для красоты/удобства, вполне можно запустить два одинаковых бурных потока. Главное, чтобы они делали воистину распараллеливание, а не последовательное решение задачи, с которой и один поток бы справился, да ещё и побыстрее бы это сделал :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.12.2010, 20:19
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 8.12.2010, 21:54) *
1-й основной, который посылает 2-м обрабатывающим задания, то это только ухудшит производительность.
и эти два вторичных буду по очереди работать + затраты на их переключение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2010, 20:33
Сообщение #11


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я так понимаю, надо просто пробовать разные варианты, и замерять общее время. Ну а потом уже выбирать лучший для данной задачи вариант?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.12.2010, 20:40
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вообще второй поток, кроме первого нужен только для того чтобы первый не замирал при длительных операциях.

Исключения составляют если ты жёстко пишешь под конкретную железку, например с 4 процами. А иначе пользователь запустит на однопроцессорной машине твою программу и увидит её заторможенность.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2010, 20:46
Сообщение #13


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Вроде понял, в основном запуска обработку половины изображений всех, и одновременно стартую 2-й поток который обрабатывает вторую половину.
Результат на лицо:
1-н поток 36 сек
2-а потока 20 сек
~50% прирост, как и читал, что прирост будет не в 2-а раза а в 1.5
PS: у меня вывод в консоль через qDebug, вроде выводит по очереди, с этим вообще могут быть проблемы? Так как что запись в один файл не лучшая идея.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.12.2010, 21:27
Сообщение #14


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 8.12.2010, 22:46) *
~50% прирост

это как раз за счёт того, что у тебя два ядра
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 9.12.2010, 9:03
Сообщение #15


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 8.12.2010, 22:19) *
и эти два вторичных буду по очереди работать + затраты на их переключение

это смотря как распределена нагрузка на потоки. в задаче, по ходу, основной поток почти что спит, а рабочие потоки выполняют какие-то вычисления. это существенно ускорит обработку в случае, если не нужна синхронизация приёма готовых данных (складываем их куда-то, по завершению обрабатываем полученный общий результат). и тут нельзя разделить на "чётное-нечётное". в реальности, кроме этой задачи проц выполняет дофига всего прочего и нет смысла выдавать задачи по очереди. просто очередную задачу получает первый из освободившихся потоков. тогда будет эффективно.

логичнее сделать какие-то сигналы о том, что поток освободился. по получению сигнала, главный поток выдаёт свободному потоку очередную задачу. а сам собирает результаты. но это, опять же, если не нужно соблюдать FIFO при обработке заданий. а если нужно, то тогда распараллеливание будет менее эффективно и нужно будет ставить какую-то доп проверку на "порядковые номера" готовых заданий.

Сообщение отредактировал Iron Bug - 9.12.2010, 9:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.12.2010, 20:41
Сообщение #16


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Как правильно определить что потоки завершились, а то сыпятся ошибки вида
Цитата
QThread destroyed while thread is still running

Рабочий вариант пока только такой:

void MyThread::run()
{
    match(1,15);
    flag=true;
}

void MyThread2::run()
{
    match(16,29);
    flag2=true;
}


а в конце main
    while (th.isRunning())
    {
        if (flag==true && flag2==true) return 0;
        wait();
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.12.2010, 21:09
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


RazrFalcon, попробуй вначале разобраться и поэкспериментировать с простыми потоками.
Сделай класс Thread, который будет выводить на консоль один символ нужное количество раз, символ и количество итераций должно передаваться в параметрах конструктора объекта. Создай один, два, три, ... экземпляра этого объекта. Разберись когда создается и завершается проект. Добавь к нему возможность преждевременного завершения потока. Потом попробуй добавить очереди, из которых потоки будут выбирать задания (символ/количество итераций) и выполнять их и т.д.
Короче постепенно. Потом, ты сам увидишь как туда добавить свою задачу.

А то пока, по твоему коду кажется, что ты не особо понимаешь как это все работает. Там ничего сложного нет, просто нужно разобраться на простых примерах. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.12.2010, 21:36
Сообщение #18


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Да просто я до этого запускал пол обработки в главном потоке, а вторую половину в дополнительном.
И когда понадобилось что бы дополнительный работал чуть дольше, вылезла такая ошибка.
Я понимаю, что просто главный завершился уже, и убивает дополнительный. Просто когда сделал два дополнительных потока, а главный только запускал их, то прога рушилась сразу, мне надо как то не дать завершатся главному потоку пока остальные не закончат работу.
А то что я написал тоже криво работает, и проц еще больше жрет <_<
Я понимаю что потоки - это не на один день, но все равно.
Что то с isFinished ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 8.6.2025, 23:29