Russian Qt Forum

Qt => Общие вопросы => Тема начата: SimpleSunny от Сентябрь 24, 2009, 00:58



Название: Пару вопросов по QThread.
Отправлено: 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())))

Можно ли заменить эти действия более красивыми методами?


Название: Re: Пару вопросов по QThread.
Отправлено: Vexator от Сентябрь 24, 2009, 05:04
1. а зачем сигнал ready() ? можно к примеру, в конструкторе передать настроечные параметры... ?
2. тут я несколько не уверен, но помоему достаточно заюзать
Код
C++ (Qt)
void QObject::moveToThread ( QThread * targetThread )


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


Название: Re: Пару вопросов по QThread.
Отправлено: Igors от Сентябрь 24, 2009, 19:16
1. Если настроечные параметры передать в конструкторе, то их, до создания обьекта, необходимо где-то будет хранить, что тоже не сильно удобно. Хотя лучше, чем у меня сейчас организовано, наверное так и сделано.
Не работал конкретно с QThread, но с нитками - да. Практически всегда создается массив данных (1 элемент на каждую нитку) перед их запуском, так что это 100% стандартная/нормальная практика. Передать что-то нитке "на ходу" (т.е. когда она уже выполняется) во много раз сложнее.


Название: Re: Пару вопросов по QThread.
Отправлено: shadone от Сентябрь 28, 2009, 11:26
я думаю в данном случае достаточно QMetaObject::invokeMethod() (http://doc.qt.nokia.com/4.5/qmetaobject.html) с параметром Qt::QueuedConnection.