C++ Qt c++;双重发射数据

C++ Qt c++;双重发射数据,c++,qt,connect,emit,C++,Qt,Connect,Emit,我有一个多服务器应用程序,目前运行良好。我有4个cpp文件。 Main.cpp构建程序。MainWindow.cpp构建ui并启动(通过按钮单击)MyServer.cpp。MyServer.cpp创建一个线程并启动MyThread.cpp。 我的目标是在文本浏览器上显示几个主要步骤(如“服务器启动”、“新连接”等) 我通过emit updateUI(“服务器启动”)传递MyServer.cpp的输出到mainwindow.cpp,其中输出被以下内容捕获: //Mainwindow.cpp

我有一个多服务器应用程序,目前运行良好。我有4个cpp文件。 Main.cpp构建程序。MainWindow.cpp构建ui并启动(通过按钮单击)MyServer.cpp。MyServer.cpp创建一个线程并启动MyThread.cpp。 我的目标是在文本浏览器上显示几个主要步骤(如“服务器启动”、“新连接”等)

我通过
emit updateUI(“服务器启动”)传递MyServer.cpp的输出到mainwindow.cpp,其中输出被以下内容捕获:

    //Mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myserver.h"
#include "mythread.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::AppendToBrowser(const QString text)
{
    ui->textBrowser->append(text);
}

void MainWindow::on_startButton_clicked()
{
    MyServer* mServer = new MyServer;
    connect(mServer, SIGNAL(updateUI(const QString)), this, SLOT(AppendToBrowser(const QString)));
    mServer->StartServer();

    ui->textBrowser->setPlainText("Server Started");
}
这正合适,因为connect命令就在mainwindow.cpp本身中。 问题从mythread.cpp中的“更深”一步开始

我在电话里发出了另一个信号

//MyThread.h

signals:
    void updateUI_serv(const QString text);
并将其连接到MyServer.cpp中的MainWindow.cpp

    //MyServer.cpp

#include "myserver.h"
#include "mainwindow.h"

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

void MyServer::StartServer()
{
    if(!this->listen(QHostAddress::Any,1234))
    {
        qDebug("Server Error");
    }
    else
    {
        qDebug("Server started");
    }
}

void MyServer::incomingConnection(int socketDescriptor)
{
    qDebug("new connection");


    MyThread *thread = new MyThread(socketDescriptor,this);
    MainWindow *mMain = new MainWindow;
    connect(thread, SIGNAL(updateUI_serv(const QString)),mMain ,SLOT(AppendToBrowser(const QString)));


    //flags thread for selfdeletion
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));



    //calls run
    thread->start();

    emit updateUI("thread started!");
}

// MyThread.cpp

#include "mythread.h"
#include "mainwindow.h"
#include "myserver.h"

MyThread::MyThread(int ID, QObject *parent) :
    QThread(parent)
{
    this->socketDescriptor = ID;
    emit updateUI_serv("start");
}

void MyThread::run()
{
    //thread stars here
    qDebug("Starting thread");
    socket = new QTcpSocket();
    emit updateUI_serv("hallo");
    //set socketdescriptor number
    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("client connected");

    exec();
}

void MyThread::readyRead()
{
    QByteArray Data = socket->readAll();
    QString Datain = QString::fromLatin1(Data);
    qDebug("Date in:");

    emit updateUI_serv("data in:");
    socket->write(Data);
}

void MyThread::disconnected()
{
    qDebug("Disconnected");
    socket->deleteLater();
    exit(0);
}
connect命令位于信号(mythread.cpp中的updateUI_serv)和插槽(mainwindow.cpp中的AppendToBrowser)文件之间。 此时,当我尝试将数据(作为客户端通过telnet)写入serverapp时,程序立即崩溃

我试图将connect命令设置到主窗口和mythread中,但这两次我都遇到了不同的问题(比如调试问题,或者文本没有显示在textBrowser中)。
到目前为止非常感谢。

最终,myServer对象没有在主线程中运行,因此从另一个线程访问ui元素会导致应用程序崩溃

通过将以下代码添加到AppendToBrowser插槽中,可以确保仅显示来自主线程的消息:

if( QApplication::instance()->thread() == QThread::currentThread() )
    ui->textBrowser->setPlainText("whateverTextThereShallBe");
else
    return;
    //You should not run into this else...
此if部分检查调用更新的当前对象是否为主线程。else部分检查错误。如果您在else部分中运行,那么您试图将ui元素更改为非主线程(ui线程)的线程。将服务器中的信号连接到另一个信号(信号->信号连接),并在MainWindow.cpp中添加连接到信号(服务器)->插槽(MainWindow)。最后,试着打第五个连接电话。排队连接(Qt::QueuedConnection IIRC)的参数。

啊,我自己得到的。
我通过创建一个新函数(
void forwarding(const Qstring);
)解决了这个问题,在该函数中,我使用普通的
emit updateUI(text)发出它。。这玩意儿终于起作用了

程序结构看起来不太清楚。主窗口创建MyServer。然后,MyServer创建另一个主窗口。这可能会创建另一个MyServer,以此类推。你有多少个主窗口?现在你几乎可以看到完整的代码了。我知道这样做不好,但我不知道在哪里寻找问题:(为什么要在
MyServer::incomingConnection
中创建另一个
MainWindow
实例?您是否知道
mMain
与最初创建
MyServer
实例的实例是完全不同的
MainWindow
实例。