Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Март 31, 2010, 15:42



Название: [решено]Потоки в потоках
Отправлено: serg_hd от Март 31, 2010, 15:42
Сабж, возможно ли такое? Есть код:
Код:
void ThreadMail::run()
{
 this->socket.moveToThread(this->thread()); //ok
 this->socket.connectToHost("pop.mail.ru", 110); //ok
 if (this->socket.waitForConnected(1000)) //тут ошибка о разных потоках
 {
  qDebug("Connected!");
 }
}
this->socket - не указатель, как видно, а объект. Если это поле декларировать как указатель, а инициализировать в самом run()'e, то конечно всё ок. Подозреваю что waitForConnected() юзает свои потоки, т.е. в потоке нельзя юзать другие потоки. Это так? Или есть ли в этом случае какая-нибудь другая альтернатива кроме инициализации указателя, просто интересно.


Название: Re: Потоки в потоках
Отправлено: BRE от Март 31, 2010, 15:47
А при конструировании объекта socket ты указываешь parent?


Название: Re: Потоки в потоках
Отправлено: serg_hd от Март 31, 2010, 15:50
А при конструировании объекта socket ты указываешь parent?

нет. Он у меня не инициализируются, у него вызывается конструктор по умолчанию.


Название: Re: Потоки в потоках
Отправлено: BRE от Март 31, 2010, 15:55
Код
C++ (Qt)
this->socket.moveToThread( this );


Название: Re: Потоки в потоках
Отправлено: serg_hd от Март 31, 2010, 15:56
Код
C++ (Qt)
this->socket.moveToThread( this );
пробовал, неа
this->socket.moveToThread(this->currentThread()); тоже нет


Название: Re: Потоки в потоках
Отправлено: BRE от Март 31, 2010, 16:08
пробовал, неа
В конструкторе.  :)


Название: Re: Потоки в потоках
Отправлено: serg_hd от Март 31, 2010, 16:20
пробовал, неа
В конструкторе.  :)
Так работает. А почему надо именно в конструкторе и как лучше делать - инициализировать указатель и декларировать его в run()'e или перемещать объект?
п.с. И всё же - почему ошибка была именно на той функции, можно ли использовать в потоках объекты использующие потоки?


Название: Re: Потоки в потоках
Отправлено: BRE от Март 31, 2010, 16:23
Так работает. А почему надо именно в конструкторе и как лучше делать - инициализировать указатель и декларировать его в run()'e или перемещать объект?
Если объект (наследник QObject) создается где то и его нужно использовать в контексте другого потока, то приходиться использовать moveToThread.
А если есть возможность создать его в run, то IMHO не зачем так извращаться.  :)


Название: [решено] Re: Потоки в потоках
Отправлено: serg_hd от Март 31, 2010, 16:26
ясно, спасиб