私は以下のコードをすべて提供しました。私がQtの初心者であることを忘れないでください。これはすばやく汚れた例です。QThreadでQTcpServerを作成し、メインスレッドからQTcpServerを作成する方法
私がしたいのは、QTcpServerリスナーを管理するQThreadを作成することです。私はそれが停止したときにリスナーを閉じて、再び起動したときにリスナーを開くことができるようにしたい。リスナーが今すぐ流出している可能性があることを無視してください。後でその問題に取り組みます。
私は、Stopが呼び出されたときに、それが作成されたスレッドとは別のスレッド(メインスレッドから呼び出されたスレッド)上でm_listener-> close()メソッドを呼び出す(TcpServerThreadで作成された) 。だから問題は、私はそれを修正する方法ですか?それを再設計してこの問題を回避する方法は?
これは完全なデザインではありません。私は実物を模倣するおもちゃの例を作っています。
tcpserverthread.h
#ifndef TCPSERVERTHREAD_H
#define TCPSERVERTHREAD_H
#include <QObject>
#include <QThread>
class QTcpServer;
class TcpServerThread : public QThread
{
Q_OBJECT
public:
TcpServerThread();
void run();
void Start();
void Stop();
public slots:
void newConnection();
private:
QTcpServer* m_pListener;
};
#endif // TCPSERVERTHREAD_H
tcpserverthread.cpp
#include "tcpserverthread.h"
#include "tcpserver.h"
#include <iostream>
#include <QTcpServer>
#include <QTcpSocket>
#include <QCoreApplication>
TcpServerThread::TcpServerThread()
{
}
void TcpServerThread::run()
{
std::cout << "thread started ..." << std::endl;
std::cout << "listener starting ..." << std::endl;
m_pListener = new QTcpServer();
connect(m_pListener, SIGNAL(newConnection()), this, SLOT(newConnection()));
if(!m_pListener->listen(QHostAddress::Any, 1234))
{
std::cout << "listener could NOT START - " << m_pListener->errorString().toStdString() << std::endl;
}
else
{
std::cout << "listener SUCCESSFULLY STARTED" << std::endl;
}
// std::cout << "thread running..." << std::endl;
// m_pListener = new TcpServer();
// m_pListener->Start();
exec();
}
void TcpServerThread::newConnection()
{
qDebug() << "in new conn ... ";
//std::cout << "in new conn.." << std::endl;
QTcpSocket *soc = m_pListener->nextPendingConnection();
soc->write("hello client");
}
void TcpServerThread::Start()
{
start();
}
void TcpServerThread::Stop()
{
std::cout << "TcpServer Stopping . . . " << std::endl;
//this close is the line that causes the problem...
m_pListener->close();
this->quit();
}
main.cppに
#include <QCoreApplication>
#include <iostream>
#include <QTcpServer>
#include "tcpserver.h"
#include "tcpserverthread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TcpServerThread *t = new TcpServerThread();
t->Start();
t->Stop();
return a.exec();
}
あなたは、メインで>停止をT-するための呼び出しをコメントアウトすることができた場合それを実行し、telnet(またはパテ)を使用して@ 127.0.0.1:1234に接続します。
私はそれを停止させてから再開するようにしたいと思うし、接続がうまくいきます。
私は、あなたが 'start'関数を呼び出す' Start'関数を作ったのを見ています。私は危険に暮らしたい:o – thuga