Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Yegor от Август 02, 2012, 20:58



Название: Перемещение объекта из одного потока в другой.
Отправлено: Yegor от Август 02, 2012, 20:58
Здравствуйте!

Имею Объект:
Код:
 QTcpSocket *access_socket = new QTcpSocket(NULL);
Родителя у него нет.

Далее нужно переместить его GUI потока в другой поток:
Код:
access_socket->moveToThread(pOtherThread);

Я так предполагаю, что эта строка переместит объект access_socket в другой поток - в pOtherThread. И там этот объект будет обрабатываться.

В это время в консоле появляется:

QObject::moveToThread: Current thread (0xebd1a98) is not the object's thread (0xd329930).
Cannot move to target thread (0xebd1a98)


Подскажите, пожалуйста, в чем ошибка. И что с этим делать.
Правильно ли я понял суть moveToThread?


Название: Re: Перемещение объекта из одного потока в другой.
Отправлено: andrew.k от Август 02, 2012, 21:30
если ты создаешь свой сокет в перегруженном методе run класса наследника QThread, то созданный экземпляр access_socket уже принадлежит текущему потоку, поэтому перемещать его не нужно и нельзя.

Судя по сообщению так и есть.
Если не так, приведи код где ты создаешь сокет, где перемещаешь, где создаешь pOtherObject.


Название: Re: Перемещение объекта из одного потока в другой.
Отправлено: LisandreL от Август 02, 2012, 22:05
Не там вызываете moveToThread.
moveToThread надо вызывать из того потока в котором объект сейчас находится, а не из того, в который он должен попасть.
То есть moveToThread «выталкивает» из текущего потока в другой, но не может «втянуть» из другого в текущий.


Название: Re: Перемещение объекта из одного потока в другой.
Отправлено: Yegor от Август 03, 2012, 11:08
Сейчас moveToThread вызываю из того потока в котором объект access_socket сейчас находится. И все работает!
Спасибо!