crossplatform.ru

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

7 страниц V  « < 4 5 6 7 >  
Ответить в данную темуНачать новую тему
> Как понять что программа работает в двух потоках?
Iron Bug
  опции профиля:
сообщение 4.11.2010, 19:26
Сообщение #51


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

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

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




Репутация:   12  


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

не поленись, сядь и нарисуй картинку: как всё должно работать, схематически изобрази связи и вызовы и что за чем идёт, стрелками. и потом составь алгоритм обработки, подробно, на бумажке. и только после этого садись писать код. а то ты городишь непонятно что и понятно, что оно не работает. потому что там принципиальные ошибки, даже не программистские, а чисто алгоритмические.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.11.2010, 19:31
Сообщение #52


Zombie Mod
*****

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

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




Репутация:   212  


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


Сообщение отредактировал RazrFalcon - 4.11.2010, 20:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 30.12.2010, 15:52
Сообщение #53


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

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




Репутация:   8  


Вклинюсь в дискуссию)

В свое время много-много убил времени на понимание потоков и как Qt с ними обращается))

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

Еще момент, на создание самого потока у системы уходит уйма времени, поэтому не стоит убивать поток сразу после того как он обработал кадр.
После обработки кадра, поток должен ждать , когда ему сунут новый кадр для обработки.
При таком ожидании лучше всего использовать условные переменные. Условные переменные - разновидность объекта для синхронизации потоков.

Вот код, отображающий все вышеперечисленные моменты)
в коде я предполагаю, что есть класс Frame, который инкапсулирует такую сущность как кадр с камеры.
класс Frame имеет член - int number, который указывает его порядковый номер )

// Класс, который будет обрабатывать кадр в отдельном потоке
class Thread : public QThread
{
    private:
        void run();


    public:
        Frame mFrame;    // Кадр, который будет обрабатывать поток
                // после обрабтки кадра, переменная mFrame должна содержать измененный кадр

        QWainCondition mCondition;
            

    signals:
        // Сигнал испускается потоком, когда тот завершит обработку кадра
        void processingFinished();

    
}


void Thread::run()
{
    QMutex mutex;
    
    for(;;)
    {
        // Здесть мы ожидаем, когда контролирующий поток даст "добро" на обработку кадра
        // предполагается, что перед тем как потоку дадут "добро", переменная mFrame будет содержать кадр, который необходимо обработать
        mutex.lock();
        mCondition.wait(&mutex);
        
        // Код обработки помещаем тут

        // Обработку завершили, высылаем сигнал
        emit processingFiniched();

        mutex.unlock();
    }

    return;
}

// Класс. который распределяет кадры между потоками
class Constructor : public QObject
{
    Q_OBJECT

public:
    // Массив обработанных кадров, в правильном порядке
    QList<Frame> mFrames;


    public slots:
        // Слот, который будет вызываться при завершении одним из потоков обработки кадра
        void on_processingFinished( );
}

// Этот слот будет выполняться в основном потоке программы
void Constructor::on_processingFinished( )
{
    // Так мы определяем какой экземпляр класса завершил обработку
    Thread *t = dynamic_cast<Thread*>( sender() );

    // Получаем обработанный кадр
    Frame frm = t->mFrame;

    // Записываем его в массив, в нужное место
    mFrames[ frm.number() ] = frm;

    // Задаем потоку кадр, который он должен обработать
    t->mFrame = get_next_frame();

    // Даем "добро" на обработку кадра
    t->mCondition.wakeOne();
}



int main( int argc, char **argv )
{
    QCoreApplication a(argc,argv);

    Constructor c;

    // Резервируем место в массиве под все кадры
    c.mFrames.reserve( frames_count );

    // Так определяем кол-во потоков, которое РЕАЛЬНО ПАРАЛЛЕЛЬНО могут выполняться в системе
    int ideal_threads = QThread::idealThreadCount();

    // Создаем и запускаем потоки
        for( int i = 0; i < ideal_threads; i++ )
    {
        Thread *t = new Thread;
        // Соединяем сигнал потока о завершении обработки со слотом рапределителя кадром
        connect( t, SIGNAL(processingFinished()), &c, SLOT(on_processingFinished() );
        
        // Запускаем поток
        t->start();

        
        // Задаем кадр, который необходимо обработать потоку
        t->mFrame = get_next_frame();

        // Даем добро на обработку кадра
        t->mCondition.wakeOne();
    }
    

    return a.exec();
}


Вероятно многое может показаться непонятным, но я постараюсь ответить на них )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.1.2011, 22:57
Сообщение #54


Zombie Mod
*****

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

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




Репутация:   212  


Большое спасибо. Очень понятный код. Буду разбираться.

У вас опечатка:
QWaitCondition
processingFinished
Еще бы инклуды написали, было бы вообще супер =)

Сообщение отредактировал RazrFalcon - 11.1.2011, 22:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 12.1.2011, 18:38
Сообщение #55


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

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




Репутация:   8  


Цитата(RazrFalcon @ 11.1.2011, 22:57) *
Большое спасибо. Очень понятный код. Буду разбираться.

У вас опечатка:
QWaitCondition
processingFinished
Еще бы инклуды написали, было бы вообще супер =)


Извиняюсь за опечатки, я писал за 20 минут до завершения последнего рабочего дня ушедшего года))

Этот код лишь как пример, не стоит слепо следовать ему )

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.1.2011, 23:22
Сообщение #56


Zombie Mod
*****

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

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




Репутация:   212  


Что мои шаги в многопоточности оооочень медленные.
Может кто нибудь написать мааааленький пример?! В котором будет открываться 10 изображений и поворачиватбся (по 5-ть в потоке), а потом по очереди выводится на форме.

Коментарии к коду выше: Constructor c; - что это?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 24.1.2011, 23:33
Сообщение #57


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(RazrFalcon @ 24.1.2011, 23:22) *
Коментарии к коду выше: Constructor c; - что это?
Мда. Всё гораздо хуже чем я думал :unsure:
Забудь про многопоточность, забудь про сетевые взаимодействия, забудь вообще про Qt. Для начала подтяни базовые знания с++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.1.2011, 23:58
Сообщение #58


Zombie Mod
*****

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

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




Репутация:   212  


ЭЭ... Возможно.
Но мне бы пример... :mellow:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.1.2011, 9:17
Сообщение #59


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

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

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




Репутация:   12  


Цитата(RazrFalcon @ 25.1.2011, 1:22) *
Может кто нибудь написать мааааленький пример?! В котором будет открываться 10 изображений и поворачиватбся (по 5-ть в потоке), а потом по очереди выводится на форме.

это уже не "мааааленький пример", а вполне себе функциональная утилитка. ты выбери: либо ты хочет стать программистом и тебе нужно много и долго учиться, либо ты работаешь где угодно, платишь деньги и тебе пишут софт другие люди, которым не лень изучать языки и системы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 25.1.2011, 19:21
Сообщение #60


Zombie Mod
*****

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

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




Репутация:   212  


Мне 19 лет ;)
И я совершенно точно нигде не работаю.
А теме уже 3-и месяца, и все это время я пытаюсь с потоками разобраться.

Фактически, сейчас у меня проблема только в том что я не понимаю как не дать главному потоку убивать второстепенные до окончания их работы.
Вот если второй поток работает меньше главного (aka main) то все работает отлично.
Вот и все проблема. А пример нежен для наглядности. В мои планы входит изучение языка, в не воровство чужой интеллектуальной собственности.
;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V  « < 4 5 6 7 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 27.4.2024, 16:43