crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Многопоточный эхо сервер, работает но несовсем как задумано...
AntonTatu
  опции профиля:
сообщение 4.3.2010, 10:56
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Учусь программированию по книге Земскова Юрия, пытаюсь разобраться с его примером клиент - многопоточный эхо сервер, понять немогу почему НЕ работает вот такая конструкция, т.е. в примере она есть но m_threads при удалении потока не уменьшается. Очень нужно с этим разобраться !.

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


Пример полностью в файле.Прикрепленный файл  echo.zip ( 3.32 килобайт ) Кол-во скачиваний: 84
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2010, 11:21
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonTatu @ 4.3.2010, 13:56) *
m_threads при удалении потока не уменьшается
а что такое m_threads, список (QList)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 4.3.2010, 11:42
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 4.3.2010, 11:21) *
а что такое m_threads, список (QList)?


QList<EchoThread*> m_threads;

ну да, принцип такой, создается соединение, сокет, поток, поток добавляется в список потоков m_threads, про метод void EchoServer::removeThread() автор пишет следующее:
"При получении сигнала о завершении потока выясняем какой именно поток сгенерировал этот сигнал, ставим этот поток в очередь на уничтожение и удаляем из списка потоков", но дело в том что я не вижу что бы thread в методе получал какое либо значение, соответственно и m_threads не уменьшается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2010, 12:17
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
  опции профиля:
сообщение 4.3.2010, 12:21
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 4.3.2010, 12:00) *
о каком значении идёт речь?


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

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


и я немогу разобраться почему.... :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2010, 12:40
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AntonTatu @ 4.3.2010, 15:21) *
и я немогу разобраться почему....
у меня только одна мысль, он к этому моменту уже мертв. Темболее что в консоль пишатся ругань, о том, что postEvent отправлен в тьму тараканью
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 4.3.2010, 13:23
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


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

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


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



все разобрался, все дело в сигнале ... создается поток , после него сигнал который не должен быть DirectConnection....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.8.2020, 15:05