• 132阅读
  • 6回复

[提问]在线程中使用QTcpServer的问题 [复制链接]

上一主题 下一主题
离线xiongj2
 

只看楼主 倒序阅读 楼主  发表于: 11-08
本人近期在线程中使用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(不能在线程中创建和起动监听)?
离线angelus

只看该作者 1楼 发表于: 11-08
这代码,我不想评论
离线圣域天子

只看该作者 2楼 发表于: 11-08
离线xiongj2

只看该作者 3楼 发表于: 11-09
回 angelus 的帖子
angelus:这代码,我不想评论 (2019-11-08 17:20) 

我只是想用一段简单的代码来表达遇到的在线程中使用QTcpServer的问题,不过,我还是想拜读一下阁下史诗级般的著作。
离线明明越

只看该作者 4楼 发表于: 11-09
run函数一直死循环的话,run函数发出的信号不能进入 事件循环队列吧。
我写的TcpServer用的是movetothread方式,而且不要死循环,tcpserver初始化和调用也要在子线程内实现。
4条评分好评度+1贡献值+1金钱+10威望+1
xiongj2 好评度 +1 - 11-09
xiongj2 贡献值 +1 - 11-09
xiongj2 威望 +1 - 11-09
xiongj2 金钱 +10 - 11-09
离线xiongj2

只看该作者 5楼 发表于: 11-09
回 明明越 的帖子
明明越:run函数一直死循环的话,run函数发出的信号不能进入 事件循环队列吧。
我写的TcpServer用的是movetothread方式,而且不要死循环,tcpserver初始化和调用也要在子线程内实现。 (2019-11-09 09:46) 

牛!按你的方法解决了,在listen()后面加一行就OK了。m_pTcpServer->moveToThread(QApplication::instance()->thread());
离线yuyu414

只看该作者 6楼 发表于: 前天 11:01
回 xiongj2 的帖子
xiongj2:牛!按你的方法解决了,在listen()后面加一行就OK了。m_pTcpServer->moveToThread(QApplication::instance()->thread());
 (2019-11-09 10:01) 

这不是又移回主线程了。。。,文档里面搜QThread,下面有例子
快速回复
限100 字节
 
上一个 下一个