Всем привет, очень бональная задача, но, тем не менее, не могу никак реализовать. Помогите пожалуйста.
Задача: Сервер прослущивает порт в основном потоке. В момент нового подключения создается поток, в который передается дискриптор сокета клиента.
Клиентов может подключаться неограниченное количество, т.о. потоков создаваться может множество. Во вновь созданном потоке
определяется объект класса, являющегося наследником класса сокет. В этом объекте у меня и происходит совственно считывание и
обработка полученных данных с сокета клиента. Переменная хранящая данные является глобальной, вследствии чего потоки не могут
её поделить между собой. Организовать синхронную работу так, чтобы работало с многими потоками не как не получается.
Есть ещё и вторая проблема: после очередной обработки сокета клиента и завершения потока размер занимаемой процессом памяти выростает
примерно на 100кб. Хотя везде вроде где надо делаю deleteLater(). Где происходит утечка? Отладчик так и не помог понять.
void CServer::incomingConnection(int socketDescriptor)
{
th = new CClientThread(socketDescriptor);
connect(th, SIGNAL(finished()), th, SLOT(deleteLater()));
connect(th, SIGNAL(sendMsg(QString)), this, SIGNAL(sendMsg(QString)));
th->moveToThread(th);
th->start();
}
Код вновь создаваемого при подключении клиента потока:
// ----------------------------------------------------------------------
CClientThread::CClientThread(int obtained_descriptor, QObject *parent)
: QThread(parent)
{
socketDescriptor = obtained_descriptor;
}
// ----------------------------------------------------------------------
void CClientThread::run()
{
NewConnect = new CConnection(socketDescriptor);
emit sendMsg("connect from " + NewConnect->peerAddress().toString());
connect(NewConnect, SIGNAL(sendMsg(QString)), this, SIGNAL(sendMsg(QString)));
connect(NewConnect, SIGNAL(disconnected()), this, SLOT(quit()));
connect(NewConnect, SIGNAL(readyRead()), NewConnect, SLOT(slotReadClient()));
connect(NewConnect, SIGNAL(readChannelFinished()), NewConnect, SLOT(slotAfterRead()));
connect(NewConnect, SIGNAL(disconnected()), NewConnect, SLOT(deleteLater()));
exec();
}
Частичный код обработки подключения:
#include "connection.h"
// ----------------------------------------------------------------------
CConnection::CConnection(int obtained_descriptor, QObject *parent)
: QTcpSocket(parent)
{
this->setSocketDescriptor( obtained_descriptor );
}
// ----------------------------------------------------------------------
void CConnection::slotReadClient()
{
QByteArray block;
block = this->readAll();
client_data += block;
}
// ----------------------------------------------------------------------
void CConnection::slotAfterRead()
{
QString data = client_data;
client_data = "";
//writeDataToDB(data);
}
Гуру помогите! Очень хочется разобраться!