2013-06-27 2 views
-1

У меня есть задача создать шахматную игру с поддержкой сетевой игры. Для разработки я использовал Qt. Проблема заключается в следующем: У меня есть класс «MyServer»: Заголовок файл->Круговая зависимость QThread

//Header file "MyServer.h"  
#ifndef MYSERVER_H 
#define MYSERVER_H 

#include <QTcpServer> 
#include <QTcpSocket> 
#include <mythread.h> 
#include <QDebug> 

class MyServer : public QTcpServer 
{ 
    Q_OBJECT 


public: 
    explicit MyServer(QObject *parent = 0); 
    void startServer(); 
    QList<QString> *usersOnline; 
    QList<QTcpSocket*> *connections; 


signals: 

public slots: 
protected: 
    void incomingConnection(int socketDescriptor); 


private: 
    QTcpServer* server; 
    //QTcpSocket* socket; 

    //QByteArray* bytes; 
    //QString* str; 

}; 

#endif // MYSERVER_H 

cpp.file

#include "myserver.h" 

MyServer::MyServer(QObject *parent) : 
    QTcpServer(parent) 
{ 
} 

void MyServer::startServer() 
{ 
    this->listen(QHostAddress::Any,1234); 
    usersOnline=new QList<QString>; 

} 
void MyServer::incomingConnection(int socketDescriptor) 
{ 
    MyThread* thread=new MyThread(socketDescriptor,this,this); 
    thread->run(); 
} 

Как вы можете видеть, этот класс с новым соединением создает новый поток. Класс "MyThread". Заголовок файла

#ifndef MYTHREAD_H 
#define MYTHREAD_H 

#include <QThread> 
#include <QTcpSocket> 
#include <QTcpServer> 
#include <QDebug> 
#include <QDataStream> 
#include <QObject> 
#include <myserver.h> 

class MyServer; 
class MyThread : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit MyThread(int ID,MyServer* s,QObject *parent = 0); 

    void run(); 

signals: 

public slots: 
    void readyRead(); 

private: 
    QTcpSocket* socket; 


    int socketDescriptor; 
}; 

#endif // MYTHREAD_H 

cpp.file

#include "mythread.h" 


MyThread::MyThread(int ID,MyServer* s,QObject *parent) : 
    QThread(parent) 
{ 
    //this->mainserver=parent; 


    //parent=new MyServer(); 
    //qDebug()<<s->usersOnline; 



    this->socketDescriptor=ID; 

} 



void MyThread::run() 
{ 

    qDebug()<<"Starts thread"; 
    socket=new QTcpSocket(); 
    socket->setSocketDescriptor(this->socketDescriptor); 
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection); 
    exec(); 
} 

void MyThread::readyRead() 
{ 
    QDataStream in(this->socket); 

    quint32 n; 
    in>>n; 
    qDebug()<<n; 
    QByteArray bytes; 
    QDataStream out(&bytes,QIODevice::WriteOnly);; 
    QString str; 

    switch (n) { 
    case 1: 

     in>>str; 
     qDebug()<<str; 
     //usersOnline->append(str); 
     //qDebug()<<*(usersOnline); 


     //out(&bytes,QIODevice::WriteOnly); 
     //out<<(*usersOnline); 




     //for(int i=0;i<this->connections->length();i++) 
     //{ 
      //connections->at(i)->is 
      //connections->at(i)->write(bytes); 
      //connections->at(i)->waitForBytesWritten(2000); 
     // } 
     break; 
    case 2: 

     in>>str; 
     qDebug()<<str; 
     break; 
    } 
} 

В конструктор "MyThread" я передать указатель на "MyServer" класс, чтобы использовать поля "usersOnline", "связи" и метод "MyServer".

Таким образом, у меня есть в моей архитектуре «круговая зависимость» с классом «MyServer» и «MyThread». Как изменить архитектуру? Большое спасибо.

+0

Просто примечание: QThread используется для управления потоками, а не для обработки данных. Вместо этого вы должны подклассифицировать QObject. Прочтите [this] (http://qt-project.org/forums/viewthread/20691) для получения дополнительной информации. – thuga

ответ

0

Удалить #include <myserver.h> из заголовка вашей нити. У вас уже есть class MyServer; прямое определение там, этого будет достаточно.

+0

Вопрос: Как изменить архитектуру? – user1712438

+0

Ну, вы можете просто удалить аргумент 'MyServer * s' от конструктора. Вы все равно не используете его. Если вам нужно использовать этот указатель в потоке, используйте форвардное определение, архитектура в порядке. Если вам не нужно использовать его, не используйте его. Если вы хотите использовать его, но без круговой зависимости, вы должны опубликовать реальный код 'MyThread', который использует указатель' MyServer'. Без этого кода никто не сможет сказать вам, как изменить архитектуру, потому что на самом деле нет зависимости, только неиспользуемый указатель. –

+0

Большое спасибо Riateche, но, как вы можете видеть в файле «myThread» cpp, я использовал указатель на «MyServer» // qDebug() < usersOnline – user1712438