crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QObject в QThread
urandom
  опции профиля:
сообщение 6.11.2011, 22:40
Сообщение #1


Студент
*

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

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




Репутация:   0  


приветствую.
извините за возможно тупой и не раз обсуждаемый вопрос, но как можно нормально обработать слоты объекта в потоке?
на сколько я знаю, обрабатывает слоты родитель объекта (или не знаю?)

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

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

пожалуйста, выскажите свое мнение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 7.11.2011, 8:35
Сообщение #2


Участник
**

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

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




Репутация:   3  


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


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

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


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

Можно посмотреть тему
http://www.forum.crossplatform.ru/index.ph...c=7751&st=0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 7.11.2011, 12:11
Сообщение #3


Старейший участник
****

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

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




Репутация:   12  


Цитата(urandom @ 6.11.2011, 23:40) *
пожалуйста, выскажите свое мнение.


Нужно посмотреть код, со слов все как то запутано.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 7.11.2011, 13:37
Сообщение #4


Студент
*

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

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




Репутация:   0  


Код потока:

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
  опции профиля:
сообщение 7.11.2011, 13:52
Сообщение #5


Участник
**

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

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




Репутация:   3  


Правильно так

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
  опции профиля:
сообщение 7.11.2011, 13:58
Сообщение #6


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

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

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




Репутация:   44  


Цитата(ssoft @ 7.11.2011, 14:52) *
Правильно так

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

MyThread::~MyThread()
{
    quit();
        wait();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
urandom
  опции профиля:
сообщение 7.11.2011, 14:08
Сообщение #7


Студент
*

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

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




Репутация:   0  


Премного благодарен.
Но как тогда удалять объект? deleteLater() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 7.11.2011, 14:15
Сообщение #8


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

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

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




Репутация:   44  


Цитата(urandom @ 7.11.2011, 15:08) *
Но как тогда удалять объект? deleteLater() ?

Если смотреть на последний вариант, то никак. Он сам разрушиться при выходе из run.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 1.12.2020, 2:07