Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многопоточный эхо сервер, работает но несовсем как задумано...
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
AntonTatu
Учусь программированию по книге Земскова Юрия, пытаюсь разобраться с его примером клиент - многопоточный эхо сервер, понять немогу почему НЕ работает вот такая конструкция, т.е. в примере она есть но m_threads при удалении потока не уменьшается. Очень нужно с этим разобраться !.

void EchoServer::removeThread(){
    EchoThread *thread = qobject_cast<EchoThread*>(sender());
    m_threads.removeAt(m_threads.indexOf(thread));
    thread->deleteLater();
}


Пример полностью в файле.Нажмите для просмотра прикрепленного файла
Litkevich Yuriy
Цитата(AntonTatu @ 4.3.2010, 13:56) *
m_threads при удалении потока не уменьшается
а что такое m_threads, список (QList)?
AntonTatu
Цитата(Litkevich Yuriy @ 4.3.2010, 11:21) *
а что такое m_threads, список (QList)?


QList<EchoThread*> m_threads;

ну да, принцип такой, создается соединение, сокет, поток, поток добавляется в список потоков m_threads, про метод void EchoServer::removeThread() автор пишет следующее:
"При получении сигнала о завершении потока выясняем какой именно поток сгенерировал этот сигнал, ставим этот поток в очередь на уничтожение и удаляем из списка потоков", но дело в том что я не вижу что бы thread в методе получал какое либо значение, соответственно и m_threads не уменьшается...
Litkevich Yuriy
Цитата(AntonTatu @ 4.3.2010, 14:42) *
но дело в том что я не вижу что бы thread в методе получал какое либо значение
о каком значении идёт речь?

в коде не достаточно проверок. Попробуй такой код:
void EchoServer::removeThread(){
    qDebug() << "EchoServer::removeThread, size before" << m_threads.size();
    EchoThread *thread = qobject_cast<EchoThread*>(sender());
    if (thread){
        int index = m_threads.indexOf(thread);
        qDebug() << "EchoServer::removeThread, index" << index;
        m_threads.removeAt(index);
        qDebug() << "EchoServer::removeThread, size after" << m_threads.size();
        thread->deleteLater();
    }else{
        qDebug() << "EchoServer::removeThread, thread is NULL";
    }
}
увидишь кое что интересное
AntonTatu
Цитата(Litkevich Yuriy @ 4.3.2010, 12:00) *
о каком значении идёт речь?


неправильно выразился, почему то в этом методе не получается выяснить какой именно поток сгенерировал сигнал о завершении потока соответственно не срабатывает
m_threads.removeAt(m_threads.indexOf(thread));

т.е. не работает
EchoThread *thread = qobject_cast<EchoThread*>(sender());


и я немогу разобраться почему.... :blink:
Litkevich Yuriy
Цитата(AntonTatu @ 4.3.2010, 15:21) *
и я немогу разобраться почему....
у меня только одна мысль, он к этому моменту уже мертв. Темболее что в консоль пишатся ругань, о том, что postEvent отправлен в тьму тараканью
AntonTatu
Цитата(Litkevich Yuriy @ 4.3.2010, 12:40) *
у меня только одна мысль, он к этому моменту уже мертв. Темболее что в консоль пишатся ругань, о том, что postEvent отправлен в тьму тараканью


да ругань я и сам вижу... немогу ничего придумать что бы заработало правильно..... :(

Цитата(AntonTatu @ 4.3.2010, 12:58) *
Цитата(Litkevich Yuriy @ 4.3.2010, 12:40) *
у меня только одна мысль, он к этому моменту уже мертв. Темболее что в консоль пишатся ругань, о том, что postEvent отправлен в тьму тараканью


да ругань я и сам вижу... немогу ничего придумать что бы заработало правильно..... :(



все разобрался, все дело в сигнале ... создается поток , после него сигнал который не должен быть DirectConnection....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.