Russian Qt Forum
Ноябрь 25, 2024, 05:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пару вопросов по QThread.  (Прочитано 4482 раз)
SimpleSunny
Гость
« : Сентябрь 24, 2009, 00:58 »

Есть класс унаследованный от QThread.

Код
C++ (Qt)
class mySecond;
class myThread : QThread
{
public:
   void setData();
   void startSecond();
 
signals:
   ready();
   strtSecond();
 
protected:
   void run();
 
private:
   mySecond *second;
}
 
void setData()
{
   second->setData();
}
 
void startSecond()
{
   //second->start()
   emit strtSecond();
}
 
void run()
{
   second = new mySecond;
   connect(this, SIGNAL(strtSecond()), second, SLOT(start()));
 
   emit ready();
 
   exec();
 
   delete second;
}

1. Сигнал ready() использую для того, чтобы знать когда обьект second создан и можно было его сконфигурировать. Конфигурация производится из главного потока.
2. startSecond() вызывается из главного потока. Для того чтобы метод second->start()  выполнялся в контексте вновь созданного потока использую промежуточный сигнал.
(Тут на ум приходит только сделать startSecond() слотом, а в глвном потоке сделать через QTimer::singleShot(0, myThread, SLOT(startSecond())))

Можно ли заменить эти действия более красивыми методами?
« Последнее редактирование: Сентябрь 24, 2009, 01:00 от SimpleSunny » Записан
Vexator
Гость
« Ответ #1 : Сентябрь 24, 2009, 05:04 »

1. а зачем сигнал ready() ? можно к примеру, в конструкторе передать настроечные параметры... ?
2. тут я несколько не уверен, но помоему достаточно заюзать
Код
C++ (Qt)
void QObject::moveToThread ( QThread * targetThread )
Записан
SimpleSunny
Гость
« Ответ #2 : Сентябрь 24, 2009, 18:29 »

1. а зачем сигнал ready() ? можно к примеру, в конструкторе передать настроечные параметры... ?
2. тут я несколько не уверен, но помоему достаточно заюзать
Код
C++ (Qt)
void QObject::moveToThread ( QThread * targetThread )
1. Если настроечные параметры передать в конструкторе, то их, до создания обьекта, необходимо где-то будет хранить, что тоже не сильно удобно. Хотя лучше, чем у меня сейчас организовано, наверное так и сделано.
2. Метод Мюнхгаузена (this->moveToThread(this)) у меня сейчас используется. Но он, насколько я понимаю, помогает только при выполнении слотов QThread связанных с сигналами из другого потока. Если же втупую вызывать функцию у QThread, то она будет выполняться в контексте вызываемого потока.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 24, 2009, 19:16 »

1. Если настроечные параметры передать в конструкторе, то их, до создания обьекта, необходимо где-то будет хранить, что тоже не сильно удобно. Хотя лучше, чем у меня сейчас организовано, наверное так и сделано.
Не работал конкретно с QThread, но с нитками - да. Практически всегда создается массив данных (1 элемент на каждую нитку) перед их запуском, так что это 100% стандартная/нормальная практика. Передать что-то нитке "на ходу" (т.е. когда она уже выполняется) во много раз сложнее.
Записан
shadone
Гость
« Ответ #4 : Сентябрь 28, 2009, 11:26 »

я думаю в данном случае достаточно QMetaObject::invokeMethod() с параметром Qt::QueuedConnection.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.196 секунд. Запросов: 22.