//myserver.cpp - тут отлавливаются сигналы incomingConnection и создается обьекты MyClient//MyServer - производный от QTcpServervoid MyServer::incomingConnection(int handle){ MyClient *client = new MyClient(this, &_clients); client->setSocket(handle);//назначить дескриптор (QTcpSocket.setSocketDescriptor()) _clients.append(client);//добавить в QList}
//myclient.cpp - тут (главный поток) обрабатываются сигналы//MyClient - не производный от QTcpSocket, тут есть переменная-сокет QTcpSocket *_sok;void MyClient::setSocket(int desc){ _sok = new QTcpSocket(this); _sok->setSocketDescriptor(desc);//тут были пляски с типами соединений connect(_sok, SIGNAL(connected()), this, SLOT(onConnect()), Qt::QueuedConnection); connect(_sok, SIGNAL(disconnected()), this, SLOT(onDisconnect()), Qt::QueuedConnection); connect(_sok, SIGNAL(readyRead()), this, SLOT(onReadyRead()), Qt::DirectConnection); connect(_sok, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)), Qt::QueuedConnection);}void MyClient::onReadyRead(){//считывается размер входящего блока и пока он не прийдет полностью обработка не начинается QDataStream in(_sok); if (_blockSize == 0) { if (_sok->bytesAvailable() < (int)sizeof(quint16)) return; in >> _blockSize; qDebug() << "_blockSize now " << _blockSize; } if (_sok->bytesAvailable() < _blockSize) return; if (_sok->bytesAvailable() >= _blockSize) _blockSize = 0;//теккущая команда серверу - второй байт в блоке quint8 command; in >> command; qDebug() << "received command " << command;//все команды кроме запроса авторизации от неавторизованного пользователя игнорируются if (!_isAutched && command != comAutchReq) return;//попытка сделать через QThread t *t1 = new t(NULL, this); t1->start();//попытка сделать через QThreadPool //MyTask *task = new MyTask(this, command); //task->setAutoDelete(true); //QThreadPool::globalInstance()->start(task); /* switch(command) { //тут обработка данных идет в главном потоке, нужно ее перенести в паралельный поток (выше попытки сделать это) }*/ //for (long long i = 0; i < 4000000000; ++i){}}
//t.cpp - обработка в потокеt::t(QObject *parent, MyClient *c) : QThread(parent){//передан указатель на MyClient _c = c;}void t::run(){ _c->_sok->write("fgds");//QObject: Cannot create children... //вызов метода MyClient тот же результат //_c->doSendUsersOnline();//QObject: Cannot create children qDebug() << "gfdg"; exec();}
C++ (Qt)class MyClient : public QThread{ MyClient(int socket ) { _socket = socket; } void run() { QTcpSocket socket; socket.setSocketDescriptor( _socket ); ... exec(); }}...MyServerSocket::incomingConnection( int socketId ){ MyClient * c = new MyClient( socketId ); connect( c, SIGNAL( finished() ), c, SLOT( deleteLater() ) ); c->start();}