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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Проблема с удалением сокета  (Прочитано 23567 раз)
BRE
Гость
« Ответ #30 : Октябрь 30, 2009, 10:21 »

Попробуй так удалять:

Код
C++ (Qt)
void main_widget::slotComingNewConnection()
{
   coming_socket=serverComing->nextPendingConnection();
   socket_thread *sock_thread=new socket_thread(coming_socket->socketDescriptor());
   ...
   connect(sock_thread,SIGNAL(finished()),this,SLOT(deleteThread()));
   sock_thread->start();
}
 
void main_widget::deleteThread()
{
   socket_thread *thread = qobject_cast<socket_thread*>( sender() );
   delete thread;
}
 
Записан
xaleva
Гость
« Ответ #31 : Октябрь 30, 2009, 10:38 »

Сделал,все равно так же.Могу только добавить что память ведет себя интересно.При создании сокета в первый раз а потом его удалении удаляется ток половина памяти.Но в дальнейшем при создании память увеличивается уже не на 0.2 а на 0.3,а при удалении удаляется 0.2.
Да, и событие finished() точно происходит.
« Последнее редактирование: Октябрь 30, 2009, 10:43 от xaleva » Записан
BRE
Гость
« Ответ #32 : Октябрь 30, 2009, 11:17 »

Сделал,все равно так же.Могу только добавить что память ведет себя интересно.При создании сокета в первый раз а потом его удалении удаляется ток половина памяти.Но в дальнейшем при создании память увеличивается уже не на 0.2 а на 0.3,а при удалении удаляется 0.2.
Да, и событие finished() точно происходит.
Стоп. Ты передаешь дескриптор, значит объект QTcpSocket созданный в QTcpServer остается живым и будет удален при разрушении объекта QTcpServer.
Вот этот объект coming_socket будет жить до тех пор пока будет жить объект serverComing.
Код
C++ (Qt)
void main_widget::slotComingNewConnection()
{
   coming_socket=serverComing->nextPendingConnection();
}
 

Попробуй сделать второй вариант, т.е. передавать в поток сам объект QTcpSocket и удалять его при завершении потока.
Код
C++ (Qt)
void main_widget::slotComingNewConnection()
{
   coming_socket=serverComing->nextPendingConnection();
   socket_thread *sock_thread=new socket_thread( coming_socket );
   ...
   sock_thread->start();
}
 
socket_thread::socket_thread( QTcpSocket *sock ) : socket( sock )
{
   socket->setParent( 0 );
   socket->moveToThread( this )
}
 
socket_thread::~socket_thread()
{
   delete socket;
}
 
void socket_thread::run()
{
   socket_coming com( socket );
   ...
   exec();
}
 
 
Записан
xaleva
Гость
« Ответ #33 : Октябрь 30, 2009, 11:26 »

 :)Да,работает,память не растет.Кстати,я не стал говорить,но в прошлый раз оказалось все таки,что она росла Веселый.Вощем все понятно,почему.По правде говоря я и сам мысленно понимал что объект то не удаляется,т.к я просто переношу дескриптор.Просто не понятно тогда зачем во всех книгах и во всех приложениях тестовых советуют именно через дескриптор делать,они ведь тоже переносят в отдельный поток.У них этих проблем не возникает чтоли? Улыбающийся
Записан
BRE
Гость
« Ответ #34 : Октябрь 30, 2009, 11:31 »

У них этих проблем не возникает чтоли? Улыбающийся
Нет, у писателей вообще проблем не много.  Подмигивающий
Записан
Ruzzz
Гость
« Ответ #35 : Ноябрь 02, 2009, 20:43 »

Просто не понятно тогда зачем во всех книгах и во всех приложениях тестовых советуют именно через дескриптор делать,они ведь тоже переносят в отдельный поток.У них этих проблем не возникает чтоли? Улыбающийся

Через дескриптор, потому что там переопределяют incomingConnection а не ловят сигнал newConnection. Именно в QTcpServer::incomingConnection и создается объект QTcpSocket который у вас давал утечку, точнее он не удалялся пока не разрушиться QTcpServer. Посмотрите пример Threaded Fortune Server.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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