-1

ネットワーク プレイをサポートするチェス ゲームを作成するタスクがあります。開発にはQtを使用しています。問題は次のとおりです。クラス「MyServer」があります:ヘッダーファイル->

//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();
}

ご覧のとおり、新しい接続を持つこのクラスは新しいスレッドを作成します。クラス「マイスレッド」。ヘッダーファイル

#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」、「connections」、および「MyServer」メソッドを使用します。

したがって、私のアーキテクチャには、「MyServer」および「MyThread」クラスとの「循環依存」があります。アーキテクチャを変更するには?どうもありがとう。

4

1 に答える 1

0

#include <myserver.h>スレッド ヘッダーから削除します。そこにはすでにclass MyServer;前方定義があり、それで十分です。

于 2013-06-27T12:24:53.267 に答える