Russian Qt Forum

Qt => Работа с сетью => Тема начата: markie от Август 07, 2013, 20:59



Название: Перенести сокет в другой объект
Отправлено: markie от Август 07, 2013, 20:59
Всем привет! Хочу перенести сокет в другой объект. Делаю следующее:
Код:
_socket->disconnect(SIGNAL(readyRead()));
SaveAction *saveAction = new SaveAction(_socket->socketDescriptor());

В конструкторе SaveAction:
Код:
_socket = new QTcpSocket(this);
if (!_socket->setSocketDescriptor(socketDescriptor))
    _logger->addEntry(_socket->errorString(), true);
connect(_socket, SIGNAL(readyRead()), SLOT(reading()));

В итоге, в объекте SaveAction можно записывать данные в сокет, но вот считывать не получается. Не подскажете, как можно реализовать подобное?


Название: Re: Перенести сокет в другой объект
Отправлено: mutineer от Август 08, 2013, 10:15
Почему не получается? Сигнал не приходит?


Название: Re: Перенести сокет в другой объект
Отправлено: Fregloin от Август 08, 2013, 10:26
Код:
connect(_socket, SIGNAL(readyRead()),this,SLOT(reading()));

Укажите явно приёмника this. Поидее должно работать. Кстати посмотрите в лог консоли, не ругается ли на то что сокет находится в другом потоке (как вариант).


Название: Re: Перенести сокет в другой объект
Отправлено: mutineer от Август 08, 2013, 10:31
А что изменится если this явно указать?


Название: Re: Перенести сокет в другой объект
Отправлено: markie от Август 08, 2013, 11:46
Да, не проходит сигнал. И вообще, если убрать в первом куске кода строчку с disconnect, то отрабатывает сигнал в объекте, из которого я пытаюсь перенести сокет. Может, нужно ещё какую-нибуь ф-цию вызвать, помимо disconnect'a? (только чтобы соеинение не разорвалось)


Название: Re: Перенести сокет в другой объект
Отправлено: mutineer от Август 08, 2013, 11:49
А зачем вообще "переносить" сокет? может его просто перепривязать к другим слотам?

Дело скорее всего в этом:
Цитировать
Note: It is not possible to initialize two abstract sockets with the same native socket descriptor.


Название: Re: Перенести сокет в другой объект
Отправлено: markie от Август 08, 2013, 13:09
Да, вы правы, придётся не переносить в другой объект, а делать всё в текущем.
Спасибо, что помогли разобраться в проблеме.


Название: Re: Перенести сокет в другой объект
Отправлено: mutineer от Август 08, 2013, 14:12
Ну или передевай в объект не дескриптор сокета, а указатель