これまでのところ正常に動作する multiserverapp があります。4 つの cpp ファイルを取得しました。Main.cpp はプログラムを構築します。MainWindow.cpp は UI を構築し、(ボタンクリックによって) MyServer.cpp を開始します。MyServer.cpp はスレッドを作成し、MyThread.cpp を開始します。私の目的は、textBrowser でいくつかの主要な手順 (「サーバーの開始」、「新しい接続」など) を示すことです。
MyServer.cpp からの出力emit updateUI("server started");
を 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 コマンドを mainwindow と mythread にも設定しようとしましたが、どちらも異なる問題が発生します (デバッグの問題や、テキストが textBrowser に表示されないなど)。これまでありがとう。