crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QThead. Как?
smartchecker
  опции профиля:
сообщение 14.11.2011, 17:06
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Нужно реализовать подобную схему взаимодействия thread'ов с отображением процесса.
Объясните как?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.11.2011, 6:47
Сообщение #2


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

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

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




Репутация:   34  


мне кажется, тут надо начать издалека.

1) Для каждой задачи создавать список пройденных условных узлов, к ним же приписывать время прохождения. Этот список передаётся между потоками вместе с задачей.

2) в конце все списки нужно объединить в один граф, использую имена условных узлов, к рёбрам прикрепить время выполнения

3) нарисовать граф
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 15.11.2011, 13:32
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Мне бы хоть пример какой-нибудь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 22.11.2011, 13:01
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Цитата(Алексей1153 @ 15.11.2011, 7:47) *
мне кажется, тут надо начать издалека.

1) Для каждой задачи создавать список пройденных условных узлов, к ним же приписывать время прохождения. Этот список передаётся между потоками вместе с задачей.

2) в конце все списки нужно объединить в один граф, использую имена условных узлов, к рёбрам прикрепить время выполнения

3) нарисовать граф

Тут приоритеты и время прохождения сущности весьма условные.
Важно только то, что какие-то потоки запускают другие.
На картинке поток D запускает потоки E,F,G. Последний из завершившихся потоков запускает поток H.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 22.11.2011, 15:29
Сообщение #5


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

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

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




Репутация:   8  


На картинке поток D запускает потоки E,F,G. Последний из завершившихся потоков запускает поток H.


Если это не критично, то лучше сделать один поток, который будет контролить запуск, завершение и обмен данными между потоками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 22.11.2011, 15:35
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Цитата(PAFOS @ 22.11.2011, 16:29) *
На картинке поток D запускает потоки E,F,G. Последний из завершившихся потоков запускает поток H.


Если это не критично, то лучше сделать один поток, который будет контролить запуск, завершение и обмен данными между потоками.

У меня в голове всё равно не складывается как пнуть один поток, при условии что он должен дождаться завершения двух-трёх других.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 22.11.2011, 16:19
Сообщение #7


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

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

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




Репутация:   8  


void ThreadManager::run()
{
    QThread *thr = 0;

    // Стартуем потоки А и B
  
    thr = new ThreadA();
    connect(thr,SIGNAL(finished()),this,SLOT(threadFinished()));
    //connect(thr,SIGNAL(terminated()),this,SLOT(threadTerminated())); <- при необходимости
    thr->start();

    m_threads << thr; // QList<QThread*> m_threads - приватный член ThreadManager

    thr = new ThreadB();
    connect(thr,SIGNAL(finished()),this,SLOT(threadFinished()));
    //connect(thr,SIGNAL(terminated()),this,SLOT(threadTerminated())); <- при необходимости
    thr->start();

    m_threads << thr;

   // Необходимо, чтобы получать сигналы и события от запущенных потоков
   exec();
}


void ThreadManager::threadFinished()
{
    QThread *thr = dynamic_cast<QThread*>(sender());
    if( thr == 0 )
    {
       /// WTF???
       return;
    }
    m_threads.removeOne(thr);
    thr->deleteLater();
  

    // смотрим какой конкретно поток завершился, чтобы взять у него результат работы
    if( dynamic_cast<ThreadA*>(thr) )
    {
       m_result.setResultFromA(  ((ThreadA*)thr)->result() );
    }
    else if( dynamic_cast<ThreadB*>(thr) )
    {
       m_result.setResultFromB(  ((ThreadB*)thr)->result() );
    }
    else
    {
       //....
    }
    


    if( m_thread.isEmpty() )
    {
       // Завершился последний поток.
       // результаты работы потоков в переменной m_result
       // можно запускать третий поток

        m_threadD = new ThreadD(); // ThreadD *m_threadD -  приватный член ThreadManager
        m_threadD->setResult( m_result );
        ///connect(...)
        ///...
        m_threadD->start();
    }
}


Сообщение отредактировал PAFOS - 22.11.2011, 16:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 22.11.2011, 16:50
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


m_result - какого типа?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 22.11.2011, 16:58
Сообщение #9


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

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

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




Репутация:   8  


Цитата
m_result - какого типа?

твоего - определи класс, где будешь хранить результаты работы потоков, эт я как пример привел)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.11.2024, 14:23