crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QThead и subthread.
smartchecker
  опции профиля:
сообщение 17.11.2011, 12:10
Сообщение #1


Студент
*

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

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




Репутация:   0  


Представим картину:
Есть поток А (ThreadA), который запускает два потока ThreadB и ThreadC, которые что-то там делают.
И тот из потоков, который завершился последним, запускает поток ThreadD.
Попутно надо куда-нибудь в qDebug() писать какой именно поток запустил поток ThreadD.

Кто-нибудь может мне дать пример?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.11.2011, 12:31
Сообщение #2


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

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

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




Репутация:   34  


глобальный мутекс в помощь :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 17.11.2011, 12:53
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 17.11.2011, 13:31) *
глобальный мутекс в помощь :)

Пример использования для танкиста можете показать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 17.11.2011, 13:56
Сообщение #4


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

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

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




Репутация:   8  


Скорее пойдет QAtomicInt. При старте каждый поток инкрементирует QAtomicInt, а при завершении декрементирует. если после декремента значение переменной == 0, тогда этот поток завершился последним.

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

void ThreadD::run()
{
// что-нить делаем
}

class ThreadC : public QThread
{
  void run();

public:
   QAtomicInt *atomic;
}

void ThreadC::run()
{
    atomic->ref();
    // что-нить делаем
    
    bool isLast = atomic->deref();
    if( !isLast )
    {
         qDebug() << this->thread() << " i'am last finished";

         ThreadD *thd = new ThreadD();
         thd->start();
    }
}

class ThreadB : public QThread
{
  void run();

public:
   QAtomicInt *atomic;
}

void ThreadB::run()
{
    atomic->ref();
    // что-нить делаем
    
    bool isLast = atomic->deref();
    if( !isLast )
    {
         qDebug() << this->thread() << " i'am last finished";

         ThreadD *thd = new ThreadD();
         thd->start();
    }
}




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

void ThreadA::run()
{
   QAtomicInt atomic;

   ThreadC *thC = new ThreadC
   thC->atomic = &atomic;
   thC->start();

   ThreadB *thB = new ThreadB
   thB->atomic = &atomic;
   thB->start();
}


Как-то так)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 18.11.2011, 15:25
Сообщение #5


Студент
*

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

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




Репутация:   0  


А с mutex'ом как будет выглядеть?

И ещё.
Допустим в ThreadB и ThreadC что-то вычисляли и мне в ThreadD нужны рез-таты этих вычислений.
Где хранить? Как доставать, если поток уже завершился?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 22.11.2011, 12:14
Сообщение #6


Студент
*

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

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




Репутация:   0  


Ну покажите мне кто-нибудь пример с mutex'ом.
Я даже не понимаю куда его тут приткнуть.
QAtomicInt смотрится красиво.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 22.11.2011, 16:00
Сообщение #7


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

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

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




Репутация:   8  


Я вижу с мьютексом только один выход - аналог QAtomicInt.

class MyAtomicInt
{
QMutex m_mutex;
int m_var;

public:
  MyAtomicInt():m_var(0){}
  void ref(){ QMutexLocker(&m_mutex); m_var++; }
  bool deref() { QMutexLocker(&m_mutex); m_var--; return m_var; }
}


далее - по аналогии с QAtomicInt
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 22.11.2011, 17:04
Сообщение #8


Студент
*

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

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




Репутация:   0  


Как из другого потока(допустим G) добраться до QAtomicInt, который является членом потока A?
Но поток А не является родителем потока G.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 23.11.2011, 8:27
Сообщение #9


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

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

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




Репутация:   8  


если поток А не имеет доступа никаким образом к потоку G (через указатель или через сигнал/слот), тогда QAtomicInt - статический член класса A
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 23.11.2011, 10:22
Сообщение #10


Студент
*

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

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




Репутация:   0  


Цитата(PAFOS @ 23.11.2011, 9:27) *
если поток А не имеет доступа никаким образом к потоку G (через указатель или через сигнал/слот), тогда QAtomicInt - статический член класса A

Поясните на примере.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 1:34