如何从线程获取变量?

时间:2019-07-28 17:58:02

标签: c++ multithreading qt sockets

我有一个使用多线程创建服务器的类。借助多线程,我可以同时连接多个用户。在一个流中,QByteArray Data被写入,但是我需要在通道中或在通道后部中使用此变量,以便我可以输出此行(即QByteArray Data)。如何在主函数或标头main中传送var Data

我想在QLable或其他方面写Data ...

main.c

#include "groundstation.h"
#include <QApplication>
#include "server.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GroundStation w;

    Server wServer;
    wServer.StartServer();
    //qDebug() << ServerThread::getString();

//    QLabel *label = new QLabel();
    //label->setText((QString));
    w.show();

    return a.exec();
}

server.cpp

#include "server.h"

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

void Server::StartServer(){

    if(!this->listen(QHostAddress::Any, 1234)){
        qDebug() << "Could not start server";
    }
    else {
        qDebug() << "Listening...";
    }

}

void Server::incomingConnection(int socketDescriptor){
    qDebug() << socketDescriptor << "Connecting...";
    ServerThread *thread = new ServerThread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

sever.h

    #ifndef SERVER_H
#define SERVER_H

#include <QTcpServer>
#include <QDebug>
#include "serverthread.h"

class Server : public QTcpServer
{
    Q_OBJECT
public:
    explicit Server(QObject *parent = 0);
    void StartServer();

signals:

public slots:

protected:
    void incomingConnection(int socketDescriptor);
};

#endif // SERVER_H

serverthread.cpp

    #include "serverthread.h"

ServerThread::ServerThread(int id, QObject *parent) :
    QThread (parent)
{
    this->socketDescriptor = id;
}

void ServerThread::run(){
    //thread starts here
    qDebug() << socketDescriptor << " Starting thread";
    socket = new QTcpSocket();

    if(!socket->setSocketDescriptor(this->socketDescriptor)){
        emit error(socket->error());
        return;
    }

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()), Qt::DirectConnection);

    qDebug() << socketDescriptor << " Client connected";

    //make this thread a loop
    exec();
}

void ServerThread::readyRead(){
    Data = socket->readAll();

    qDebug() << socketDescriptor << " Data in: " << Data;

    socket->write(Data);
}

void ServerThread::disconnected(){
    qDebug() << socketDescriptor << " Disconnected";
    socket->deleteLater();
    exit(0);
}

serverthread.h

#ifndef SERVERTHREAD_H
#define SERVERTHREAD_H

#include <QThread>
#include <QTcpSocket>
#include <QDebug>

class ServerThread : public QThread
{
    Q_OBJECT
public:
    QByteArray Data;

    explicit ServerThread(int id, QObject *parent = 0);
    void run();

signals:
    void error(QTcpSocket::SocketError socketerror);

public slots:
    void readyRead();
    void disconnected();

public slots:

private:
    QTcpSocket *socket;
    int socketDescriptor;

};

#endif // SERVERTHREAD_H

0 个答案:

没有答案