1

QT ライブラリを使用して、最初のマルチスレッド アプリケーションの作成を開始しています。

QTcpServer と QTcpSocket に関する qt ガイドに従って、このコンストラクターとの接続を作成するサーバー アプリケーションを作成しました。

Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    server = new QTcpServer();
    QString ipAddress;

    if (ipAddress.isEmpty())
        ipAddress = QHostAddress(QHostAddress::LocalHost).toString();

    if (!server->listen(QHostAddress(ipAddress),41500))
    {
        qDebug() << "Enable to start server";
        server->close();
        return;
    }

    connect(server,SIGNAL(newConnection()),this,SLOT(incomingConnection()));
}

これは、新しいクライアントが接続を試みるたびに新しいスレッドを作成する incomingConnection() 関数です。

void Connection::incomingConnection()
{
    QTcpSocket *socket = new QTcpSocket();
    socket = this->nextPendingConnection();

    MyThreadClass *thread = new MyThreadClass(socket, server);
    qDebug() << "connection required by client";
    if (thread != 0)
    {
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
    }
    else
        qDebug() << "Error: Could not create server thread.";
}

さて、これは MyThreadClass です:

MyThreadClass::MyThreadClass(QTcpSocket *socket, QTcpServer *parent) : QThread(parent)
{
    tcpSocket = new QTcpSocket();
    database = new Db();
    blockSize = 0;

    tcpSocket = socket;

    qDebug() << "creating new thread";
}


MyThreadClass::~MyThreadClass()
{
    database->~Db();
}


void MyThreadClass::run()
{
    qDebug() << "Thread created";
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(dataAvailable()));
    exec();
}


void MyThreadClass::dataAvailable()
{
    qDebug() << "data available";
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(qint16))
            return;
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    QString string;
    in >> string;

    //[...]

 }

コードは正常にコンパイルされますが、(サーバーの起動後に) クライアントを起動すると、サーバーから次のエラーが表示されます。

QObject::connect: Cannot connect (null)::readyRead() to QThread::dataAvailable()

その後、サーバーはクライアントからデータを受信できません。

誰かが何か考えがありますか?

事前に感謝 ダニエレ

4

1 に答える 1

2
socket = this->nextPendingConnection();

次のようにする必要があります。

socket = server->nextPendingConnection();

Active としてではserverなくメンバーを使用しているため、クラスはから継承する必要はなく、からのみ継承する必要があります。thisQTcpServerConnectionQTcpServerQObject

また、あなたは悪用してQThreadいます。QtSqlモジュールを使用している場合は、スレッド全体のシグナルとスロット、おそらくスレッドとSQLモジュールを読む必要があります。Db

于 2012-05-23T02:10:54.523 に答える