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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление отключенного сокета в многопоточном сервере  (Прочитано 3752 раз)
akaMDA
Гость
« : Май 29, 2012, 15:15 »

Многопоточный TCP сервер на QT. Каждое новое сединение сохраняется в QHash<int, QTcpSocket*>, где ключем является int QTcpSocket::socketDescriptor(). В процессе работы все нормально, но при удалении сокета (сигнал void QTcpSocket::disconnected()) в слоте приходится переберать все подключения и находить возвращающий -1 int QTcpSocket::socketDescriptor()  sender(). Можно ли сделать удаление так, чтобы не было непобхожимости перебирать все подключения?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Май 29, 2012, 16:24 »

Код
C++ (Qt)
   QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
   if (!socket)
       return;
   int desc = hash.key(socket);
   hash.remove(desc);
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
akaMDA
Гость
« Ответ #2 : Май 30, 2012, 07:51 »

Да, я че-то затупил.
Еще вопрос. Слот, вызываемый при сигнале readyRead() от разных сокетов вызывается судя по TID в главном потоке. Надо ди помещать код слота, например, в мьютексы, или одновременного вызовала слота не произойдет?
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Май 30, 2012, 11:20 »

Вызов слота одновременно не произойдет, т.к. между потоками сигналы отрабатывают через очередь сообщений. Но если ты в слоте будешь трогать внутренние данные потока, то наверное их надо защитить.
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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