Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QObject в QThread
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
urandom
приветствую.
извините за возможно тупой и не раз обсуждаемый вопрос, но как можно нормально обработать слоты объекта в потоке?
на сколько я знаю, обрабатывает слоты родитель объекта (или не знаю?)

в общем я поместил объект в поток (не moveToThread, а создал отдельный объект потока и в него сунул объект и создал его через в run())
основной же объект связал с тем что в потоке через систему сигналов-слотов.

все это конечно работает, но вот правильно ли я это все реализую?
или можно было поступить проще и эффективнее?

пожалуйста, выскажите свое мнение.
ssoft
Цитата(urandom @ 6.11.2011, 23:40) *
на сколько я знаю, обрабатывает слоты родитель объекта (или не знаю?)


Что-то здесь не так.

Цитата(urandom @ 6.11.2011, 23:40) *
все это конечно работает, но вот правильно ли я это все реализую?


По описанию, все правильно.

Можно посмотреть тему
http://www.forum.crossplatform.ru/index.ph...c=7751&st=0
wiz29
Цитата(urandom @ 6.11.2011, 23:40) *
пожалуйста, выскажите свое мнение.


Нужно посмотреть код, со слов все как то запутано.
urandom
Код потока:

MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
}

MyThread::~MyThread()
{
    delete MyObject;
}

/// PROTECTED ///

void MyThread::run()
{
    myObject = new MyObject();
    connect(parent(), SIGNAL(mySignal(QString)), myObject, SLOT(mySlot(QString)));
    // тут еще куча сигналов/слотов

    exec();
}


Думаю, показывать код объекта нет смысла.
ssoft
Правильно так

MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
}

MyThread::~MyThread()
{
    quit();
}

/// PROTECTED ///

void MyThread::run()
{
    MyObject myObject;
    connect(parent(), SIGNAL(mySignal(QString)), &myObject, SLOT(mySlot(QString)));
    // тут еще куча сигналов/слотов

    exec();
}


Нельзя просто так удалять объект MyObject в деструкторе, т.к. они сопоставлены разным потокам.
Ну и завершить поток нужно, чтобы не болтался.
BRE
Цитата(ssoft @ 7.11.2011, 14:52) *
Правильно так

Ну тогда я бы добавил wait. Перед разрушением стоит дождаться реального завершения нитки.

MyThread::~MyThread()
{
    quit();
        wait();
}
urandom
Премного благодарен.
Но как тогда удалять объект? deleteLater() ?
BRE
Цитата(urandom @ 7.11.2011, 15:08) *
Но как тогда удалять объект? deleteLater() ?

Если смотреть на последний вариант, то никак. Он сам разрушиться при выходе из run.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.