Russian Qt Forum

Qt => Общие вопросы => Тема начата: ilyagoo от Январь 15, 2010, 16:09



Название: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 16:09
Вопрос в следующем:
создаю наследника QThread, запускаю его QThread::start() и жду сигнал started(). в какой именно момент он приходит?


Название: Re: QThread и сигнал started()
Отправлено: BRE от Январь 15, 2010, 16:14
Перед входом в Thread::run()


Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 16:23
и зачем он тогда, если поток еще создал ни одного локального объекта в функции run()?
допустим, там я создаю сокет, и когда поток запустится, хочу законнектиться с сервером, а сокета еще нет?


Название: Re: QThread и сигнал started()
Отправлено: BRE от Январь 15, 2010, 16:28
и зачем он тогда, если поток еще создал ни одного локального объекта в функции run()?
Хм, уведомление о том, что сейчас заработает.  :)

допустим, там я создаю сокет, и когда поток запустится, хочу законнектиться с сервером, а сокета еще нет?
Код
C++ (Qt)
void Thread::run()
{
QTcpSocket socket;
socket.connectToHost( ... );
...
}
 
Для чего ждать сигнала? Как ты планируешь обращаться к локальным объектам созданным в run из другого слота?


Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 16:31
типа того. в локальном объекте есть еще один поток, и мне нужно ждать, пока тот будет готов.
а как это: сейчас заработает. QSpinBox же не говорит, что его значение сейчас изменится...


Название: Re: QThread и сигнал started()
Отправлено: BRE от Январь 15, 2010, 16:40
типа того. в локальном объекте есть еще один поток, и мне нужно ждать, пока тот будет готов.
Добавь свой сигнал или используй какой нибудь флажок.

а как это: сейчас заработает. QSpinBox же не говорит, что его значение сейчас изменится...
Это мое предположение.  :) Для каких целей ты будешь его использовать (и будешь ли?) зависит уже от тебя.


Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 16:51
я в run() создаю локальный объект с относительно большим и тугим конструктором, потом делаю connectы. ожидалось, что сигнал started() будет эмитится только в момент начала цикла обработки событий exec(). а получается, что я буду пытаться работать с объектом либо до connect(), либо вообще пока он еще недоконструирован...
флажки не помогут. ждать по таймеру -  :o :o :o
я в тупике...


Название: Re: QThread и сигнал started()
Отправлено: Vass от Январь 15, 2010, 16:55
Если в локальном объекте есть еще один поток почему бы не взять сигнал started() от этого локального потока?


Название: Re: QThread и сигнал started()
Отправлено: BRE от Январь 15, 2010, 16:56
Расскажи подробней (желательно с кодом), где что создается и запускается. А то не очень понятно.


Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 17:10
Если в локальном объекте есть еще один поток почему бы не взять сигнал started() от этого локального потока?
ну да, а этот сигнал в свою очередь будет эмитирован до создания внутренних объектов "еще одного поток" и т.д. :)

а что, если я перед exec() выдам свой сигнал threadStarted(), будет ли это корректно?


Название: Re: QThread и сигнал started()
Отправлено: BRE от Январь 15, 2010, 17:14
а что, если я перед exec() выдам свой сигнал threadStarted(), будет ли это корректно?
Будет.
Но интересны подробности, возможно получиться сделать и без него.




Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 17:16
подробности вечером.
буду вырезать, т.к. много букаф ;)


Название: Re: QThread и сигнал started()
Отправлено: ilyagoo от Январь 15, 2010, 21:02
короче, я подумал и решил, что это вполне катит, т.к. сигналы локальный объект получит, а его сигналы будут эмитироваться в ответ:
Код:
class TObj : public QThread
{
public:
    TObj(){};
    ~TObj(){};

protected:
    void run()
    {
        TLocalObj obj;
        connect( &obj, SIGNAL( fromLocalObjSignal() ), this, SLOT( toObjSlot() ), Qt::QueuedConnection );
        connect( this, SIGNAL( fromLocalObjSignal() ), &obj, SLOT( toLocalObjSlot() ), Qt::QueuedConnection );

        emit threadStarted();
        exec();
    };

signals:
    void threadStarted();
}

спасибо за участие :)