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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается синхронизировать потоки  (Прочитано 2227 раз)
i-cpp
Гость
« : Апрель 06, 2010, 22:05 »

Всем привет, очень бональная задача, но, тем не менее, не могу никак реализовать. Помогите пожалуйста.

Задача: Сервер прослущивает порт в основном потоке. В момент нового подключения создается поток, в который передается дискриптор сокета клиента.
Клиентов может подключаться неограниченное количество, т.о. потоков создаваться может множество. Во вновь созданном потоке
определяется объект класса, являющегося наследником класса сокет. В этом объекте у меня и происходит совственно считывание и
обработка полученных данных с сокета клиента. Переменная хранящая данные является глобальной, вследствии чего потоки не могут
её поделить между собой. Организовать синхронную работу так, чтобы работало с многими потоками не как не получается.

Есть ещё и вторая проблема: после очередной обработки сокета клиента и завершения потока размер занимаемой процессом памяти выростает
примерно на 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);
}

Гуру помогите! Очень хочется разобраться!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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