2013-06-27 3 views
-1

네트워크 재생을 지원하는 체스 게임을 만드는 작업이 있습니다. 개발을 위해 Qt를 사용해 왔습니다. 다음과 같이 문제는 다음과 같습니다 I 클래스 "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". "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; 
    } 
} 

난 "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' 인수를 제거 할 수 있습니다. 어쨌든 그것을 사용하지 마십시오. 스레드에서이 포인터를 사용해야 할 경우, 포워드 정의를 사용하면 아키텍처가 정상적으로 작동합니다. 사용하지 않으려면 사용하지 마십시오. 순환 의존성을 사용하지 않고 그것을 사용하려면, MyServer 포인터를 사용하는 실제'MyThread' 코드를 게시해야합니다. 이 코드가 없으면 사실 아무런 의존성이없고 사용되지 않는 포인터 만 있기 때문에 아무도 아키텍처를 변경하는 방법을 알 수 없습니다. –

+0

감사합니다. Riateche하지만 "MyThread"cpp 파일에서 볼 수 있듯이 "MyServer"에 대한 포인터를 사용했습니다. // qDebug() < usersOnline – user1712438