crossplatform.ru

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

> Как правильно поместить объект в поток
mezmay
  опции профиля:
сообщение 29.11.2012, 16:58
Сообщение #1


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

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

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




Репутация:   1  


В несложных ситуациях помещал объект в поток так:

class CWork //класс рабочего объекта
...

class CMyThread : public QThread
...

void CMyThread::run()
{
    CWork work;

    connect(m_pGUIThread, SIGNAL(someSignal()),
        &work, SLOT(someSlot()));
    ...
    // и т.д. и т.п.

   exec();
}

Если кому-то интересно в чем суть проекта, то она здесь: http://www.forum.crossplatform.ru/index.php?showtopic=9000

Здесь же задам более конкретный вопрос: допустим я создал два объекта типа CMyThread:
CMyThread thread_A;
thread_A.start();
CMyThread thread_B;
thread_B.start();

В каждом из них создались соответственно объекты work и начали жить в run()'е.
Один из этих объектов получил данные, скажем QByteArray, который надо передать во второй объект. Как по-нормальному их передать? Или стоит как-то по-другому организовывать работу объектов в потоках?

P.S. можно ли думать о передаче QByteArray через сигналы/слоты по значению, или пойти купить рыбу и у**ать себя по лицу?)

Сообщение отредактировал mezmay - 30.11.2012, 20:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ssoft
  опции профиля:
сообщение 30.11.2012, 8:40
Сообщение #2


Участник
**

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

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




Репутация:   3  


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

class CWork //класс рабочего объекта
...

class CMyThread : public QThread
{
    typedef QSharedPointer< CWork > WorkPointer;
    WorkPointer work;

public:
    CWork * workObject () const;

signals:
   void workCreated ();

};

void CMyThread::run()
{
    work = WorkPointer( new CWork() );

    emit workCreated();

    exec();
}


// применение
int main ( int argc, char ** argv )
{
    QApplication app( argc, argv );

    CMyThread thread1;
    QEventLoop loop1;
    connect( &thread1, SIGNAL( workCreated() )
        , &loop1, SLOT( quit() ) );
    tread1.start();
    // ожидаем сигнала от tread1
    loop1.exec();

    CMyThread thread2;
    QEventLoop loop2;
    connect( &thread2, SIGNAL( workCreated() )
        , &loop2, SLOT( quit() ) );
    tread2.start();
    // ожидаем сигнала от tread2
    loop2.exec();

    // соединяем на здоровье
    connect ( tread1.workObject(), SIGNAL( ... )
        , tread2.workObject(), SLOT( ... ) ) );

    return app.exec();
}


Да, и QByteArray можно передавать по значению, т.к. внутри организован указатель на данные с подсчетом ссылок, т.е. данные при передаче по значению не копируются.

Сообщение отредактировал ssoft - 30.11.2012, 8:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 22.11.2024, 13:20