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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread и сигнал started()  (Прочитано 5660 раз)
ilyagoo
Гость
« : Январь 15, 2010, 16:09 »

Вопрос в следующем:
создаю наследника QThread, запускаю его QThread::start() и жду сигнал started(). в какой именно момент он приходит?
Записан
BRE
Гость
« Ответ #1 : Январь 15, 2010, 16:14 »

Перед входом в Thread::run()
Записан
ilyagoo
Гость
« Ответ #2 : Январь 15, 2010, 16:23 »

и зачем он тогда, если поток еще создал ни одного локального объекта в функции run()?
допустим, там я создаю сокет, и когда поток запустится, хочу законнектиться с сервером, а сокета еще нет?
Записан
BRE
Гость
« Ответ #3 : Январь 15, 2010, 16:28 »

и зачем он тогда, если поток еще создал ни одного локального объекта в функции run()?
Хм, уведомление о том, что сейчас заработает.  Улыбающийся

допустим, там я создаю сокет, и когда поток запустится, хочу законнектиться с сервером, а сокета еще нет?
Код
C++ (Qt)
void Thread::run()
{
QTcpSocket socket;
socket.connectToHost( ... );
...
}
 
Для чего ждать сигнала? Как ты планируешь обращаться к локальным объектам созданным в run из другого слота?
Записан
ilyagoo
Гость
« Ответ #4 : Январь 15, 2010, 16:31 »

типа того. в локальном объекте есть еще один поток, и мне нужно ждать, пока тот будет готов.
а как это: сейчас заработает. QSpinBox же не говорит, что его значение сейчас изменится...
Записан
BRE
Гость
« Ответ #5 : Январь 15, 2010, 16:40 »

типа того. в локальном объекте есть еще один поток, и мне нужно ждать, пока тот будет готов.
Добавь свой сигнал или используй какой нибудь флажок.

а как это: сейчас заработает. QSpinBox же не говорит, что его значение сейчас изменится...
Это мое предположение.  Улыбающийся Для каких целей ты будешь его использовать (и будешь ли?) зависит уже от тебя.
Записан
ilyagoo
Гость
« Ответ #6 : Январь 15, 2010, 16:51 »

я в run() создаю локальный объект с относительно большим и тугим конструктором, потом делаю connectы. ожидалось, что сигнал started() будет эмитится только в момент начала цикла обработки событий exec(). а получается, что я буду пытаться работать с объектом либо до connect(), либо вообще пока он еще недоконструирован...
флажки не помогут. ждать по таймеру -  Шокированный Шокированный Шокированный
я в тупике...
Записан
Vass
Гость
« Ответ #7 : Январь 15, 2010, 16:55 »

Если в локальном объекте есть еще один поток почему бы не взять сигнал started() от этого локального потока?
Записан
BRE
Гость
« Ответ #8 : Январь 15, 2010, 16:56 »

Расскажи подробней (желательно с кодом), где что создается и запускается. А то не очень понятно.
Записан
ilyagoo
Гость
« Ответ #9 : Январь 15, 2010, 17:10 »

Если в локальном объекте есть еще один поток почему бы не взять сигнал started() от этого локального потока?
ну да, а этот сигнал в свою очередь будет эмитирован до создания внутренних объектов "еще одного поток" и т.д. Улыбающийся

а что, если я перед exec() выдам свой сигнал threadStarted(), будет ли это корректно?
Записан
BRE
Гость
« Ответ #10 : Январь 15, 2010, 17:14 »

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


Записан
ilyagoo
Гость
« Ответ #11 : Январь 15, 2010, 17:16 »

подробности вечером.
буду вырезать, т.к. много букаф Подмигивающий
Записан
ilyagoo
Гость
« Ответ #12 : Январь 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();
}

спасибо за участие Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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