本人近期在线程中使用QTcpServer发现无法进入QTcpServer::incomingConnection(qintptr)函数,也接收不到newConnection()信号。现将代码展示如下:
首先,声明TestThread类:
#pragma once
#include <QThread>
#include <QTcpServer>
class TestThread : public QThread
{
Q_OBJECT
public:
TestThread(QObject *parent);
~TestThread();
void stop();
protected:
void run();
private slots:
void slotNewConnection();
private:
QTcpServer* m_pTcpServer;
bool m_bActive;
bool m_bStop;
};
该类的实现如下:
#include "testthread.h"
#include <QDebug>
TestThread::TestThread(QObject *parent)
: QThread(parent), m_pTcpServer(0), m_bActive(false), m_bStop(false)
{
}
TestThread::~TestThread()
{
stop();
}
void TestThread::stop()
{
while (m_bActive)
{
m_bStop = true;
wait(200);
}
}
void TestThread::run()
{
m_bStop = false;
m_bActive = false;
if (!m_pTcpServer)
{
m_pTcpServer = new QTcpServer();
QObject::connect(m_pTcpServer, SIGNAL(newConnection()),
this, SLOT(slotNewConnection()));
}
while (1)
{
if (m_bStop)
{
break;
}
m_bActive = true;
if (m_pTcpServer && !m_pTcpServer->isListening())
{
m_pTcpServer->listen(QHostAddress::Any, 2404);
}
//Do something
msleep(500);
}
if (m_pTcpServer)
{
delete m_pTcpServer;
m_pTcpServer = 0;
}
m_bStop = false;
m_bActive = false;
}
void TestThread::slotNewConnection()
{
qDebug() << __FUNCTION__ << ": New Connection";
}
在主窗口放置两个按钮,启动线程和停止线程:
void XTest::slotStart()
{
if (!m_Thread)
m_Thread = new TestThread(this);
if (m_Thread)
m_Thread->start();
}
void XTest::slotStop()
{
if (m_Thread)
m_Thread->stop();
}
发现当客户端连接时,进入不了TestThread::slotNewConnection()。请大师帮忙指点一下,究竟是我的代码问题,还是QTcpServer的Bug(不能在线程中创建和起动监听)?