Russian Qt Forum

Qt => Работа с сетью => Тема начата: akaMDA от Май 29, 2012, 15:15



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


Название: Re: Удаление отключенного сокета в многопоточном сервере
Отправлено: Kurles от Май 29, 2012, 16:24
Код
C++ (Qt)
   QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
   if (!socket)
       return;
   int desc = hash.key(socket);
   hash.remove(desc);


Название: Re: Удаление отключенного сокета в многопоточном сервере
Отправлено: akaMDA от Май 30, 2012, 07:51
Да, я че-то затупил.
Еще вопрос. Слот, вызываемый при сигнале readyRead() от разных сокетов вызывается судя по TID в главном потоке. Надо ди помещать код слота, например, в мьютексы, или одновременного вызовала слота не произойдет?


Название: Re: Удаление отключенного сокета в многопоточном сервере
Отправлено: navrocky от Май 30, 2012, 11:20
Вызов слота одновременно не произойдет, т.к. между потоками сигналы отрабатывают через очередь сообщений. Но если ты в слоте будешь трогать внутренние данные потока, то наверное их надо защитить.