0

In an earlier Question I asked about why my program/QTcpServer was crashing all the time, and I really appreciate the help I got from everyone.

However, I have decided to try and rebuild the Program from scratch in order to see why it crashes, and I may have found something.

Allow me to post the new Code below:

//mainwindow.h

#include <QMainWindow>
#include <QPushButton>
#include <QTextEdit>
#include <QStandardItemModel>
#include <QTcpServer>
#include <QTcpSocket>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void startServer();
    void handleConnection();
    void readMessage();
    void ReadXML(QString XMLString);

private:
    QPushButton *SServer;
    QTextEdit * ContainerView; //not changing to QTableView just yet
    int Pallet_Number;
    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;
};
//mainwindow.cpp

#include "mainwindow.h"
#include <QLabel>
#include <QLayout>
#include <QDebug>
#include <QDomDocument>
#include <QRegularExpression>

static QRegularExpression Box_Code("B");
static QRegularExpression Cylinder_Code("C");

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      SServer(new QPushButton("Start Listening")),
      ContainerView(new /*QTableView*/QTextEdit),
      tcpServer(new QTcpServer),
      tcpSocket(new QTcpSocket)
{
    QStringList HeaderRow;
    HeaderRow.append("Pallet");
    HeaderRow.append("Container");
    HeaderRow.append("Code");
    HeaderRow.append("Height");
    HeaderRow.append("Breadth/Diameter");
    HeaderRow.append("Length");
    HeaderRow.append("Weight");

    resize(800,300);

    connect(SServer, &QPushButton::clicked, this, &MainWindow::startServer);
    connect(tcpServer, &QTcpServer::newConnection, this, &MainWindow::handleConnection);
    connect(tcpSocket, &QTcpSocket::readyRead, this, &MainWindow::handleConnection);

    QLabel *Lab1(new QLabel("Listening on Port 6164"));
    QHBoxLayout *HB(new QHBoxLayout);
    QVBoxLayout *VB(new QVBoxLayout);
    HB->addWidget(SServer);
    HB->addWidget(Lab1);
    VB->addItem(HB);
    VB->addWidget(ContainerView);
    QWidget *window(new QWidget);
    window->setLayout(VB);
    setCentralWidget(window);
}

MainWindow::~MainWindow()
{
}

void MainWindow::startServer()
{
    if(!tcpServer->listen(QHostAddress::LocalHost, 6164)){
        qDebug() << "Error connecting to Server";

        tcpServer->close();
        return;
    } else {
        qDebug() << "Started Successfully";
    }
}

void MainWindow::handleConnection()
{
    tcpSocket = tcpServer->nextPendingConnection();
    qDebug() << "New Connection!";
    connect(tcpSocket, &QTcpSocket::readyRead, this, &MainWindow::readMessage);
}

void MainWindow::readMessage()
{
    ContainerView->clear(); //clear table to prepare for new XMLString
    QByteArray buffer = tcpSocket->readAll();
    QString FromContainer = QString::fromUtf8(buffer);
    ReadXML(FromContainer);
}

void MainWindow::ReadXML(QString XMLString)
{
    ContainerView->append(XMLString);

    QDomDocument Xml_String;
    Xml_String.setContent(XMLString);

    QDomElement Xml_Root = Xml_String.documentElement();
    if(Xml_Root.tagName() == "Pallets")
    {
        QDomElement Xml_Pallet = Xml_Root.firstChildElement();
        while(!Xml_Pallet.isNull())
        {
            if(Xml_Pallet.tagName() == "Pallet")
            {
                int PN = Xml_Pallet.attribute("Number").toInt(nullptr,10);
                QDomElement Box_Cyl = Xml_Pallet.firstChildElement();
                while(!Box_Cyl.isNull())
                {
                    if(Box_Cyl.tagName() == "Box")
                    {
                        QString BC = Box_Cyl.tagName();
                        ContainerView->append("Pallet No. " + QString::number(PN) + "\nContainer: " + BC);
//                        QDomElement Box_Info = Box_Cyl.firstChildElement();
//                        while(!Box_Info.isNull())
//                        {
//                            ...more code
//                            Box_Info = Box_Info.nextSiblingElement();
//                        }
                    } else if(Box_Cyl.tagName() == "Cylinder")
                    {
                        QString BC = Box_Cyl.tagName();
                        ContainerView->append("Pallet No. " + QString::number(PN) + "\nContainer: " + BC);
                    }
                    Box_Cyl = Box_Cyl.nextSiblingElement();
                }
            }
            Xml_Pallet = Xml_Pallet.nextSiblingElement();
        }
    }
}

The XML String I am trying to read is shown below:
Xml_String
When I include the commented code to read the Elements within 'Box' or 'Cylinder' (I altered the code to check both sides), the program freezes.

This hasn't happened to me before, so I have no idea what to do.

0 Answers0