3

我在使用 QTcpSocket 时遇到问题,它没有发出任何信号:/


void NetworkInstance::run()
{
    m_pSocket = new QTcpSocket();
    connect(m_pSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError()));
    connect(m_pSocket, SIGNAL(hostFound()), this, SLOT(socketHostLookupDone()));
    connect(m_pSocket, SIGNAL(connected()), this, SLOT(socketConnected()));
    connect(m_pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));

    connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(socketReadyRead()));

    QSettings s;
    s.beginGroup("network");
    emit log(QString("Connection to: ").append(s.value("host").toString()).append(":").append(s.value("port").toString()));
    m_pSocket->connectToHost(s.value("host").toString(), s.value("port").toInt());
    s.endGroup();

    exec();
}

这是我的代码,我没有看到任何错误,但没有发出连接的信号(hostFound、connected 等)。在服务器上,我可以看到已建立连接并发送了数据,但客户端没有任何反应。NetworkInstance 正在扩展 QThread。

4

2 回答 2

2

根据我之前的评论,子类化 QThread 是错误的,您需要做的是创建从 QObject 继承的类,然后将其移动到新的 QThread。

所以你会有一个看起来像这样的类: -

class NetworkInstance : public QObject
{
    Q_OBJECT

public:
    NetworkInstance();

public slots:
    void Run();

    void socketConnected();
    void socketError();
    // etc for other slots...

private:
    class QTCPSocket* m_pSocket;
}

创建您的网络实例对象和线程: -

QThread* pThread = new QThread;
NetworkInstance* pNetworkInstance = new NetworkInstance;

创建 QTCPSocket 实例并连接 NetworkInstance 类中的信号/插槽,然后创建 QThread 并将您的类移动到线程:-

pNetworkInstance->moveToThread(pThread);

最后,启动线程运行:-

pThread->start();
于 2013-08-13T15:25:39.597 回答
0

我确信信号已经发出。我不太确定它们是否被另一个线程中的插槽接收。应该。一般。

Qt::自动连接

(默认)如果信号是从与接收对象不同的线程发出的,则信号被排队,表现为 Qt::QueuedConnection。否则,槽被直接调用,表现为 Qt::DirectConnection。连接类型在信号发出时确定。

但是现在你在 run() 中使用 exec() 开始你自己的事件循环。

编辑:啊……我明白了……

Qt::QueuedConnection

当控制返回到接收者线程的事件循环时调用该槽。插槽在接收者的线程中执行。

这就是自动使用的,因为发送者和接收者在不同的线程中。但是使用你的 'exec()' 控件永远不会返回到接收者的线程。

于 2013-08-13T14:39:20.867 回答