crossplatform.ru

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

> QThead и subthread.
smartchecker
  опции профиля:
сообщение 17.11.2011, 12:10
Сообщение #1


Студент
*

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

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




Репутация:   0  


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

Кто-нибудь может мне дать пример?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
PAFOS
  опции профиля:
сообщение 17.11.2011, 13:56
Сообщение #2


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

Группа: Участник
Сообщений: 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();
}


Как-то так)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.2.2025, 0:58