【发布时间】:2016-07-11 18:37:23
【问题描述】:
我坚持阅读关于线程 qt-networking 的教程(这里是:http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html),我做了一些小的改动并将其集成到我的主程序中。然而incomingConnection() 永远不会被执行,另一方面,客户端能够连接。因为我想使用 incomingConnection(),所以使用 SIGNAL(newConnection()) 已经过时了,但即使这样也行不通。
有人知道出了什么问题吗?
这里是我的.h
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
class WirelessNetThread: public Thread
{
Q_OBJECT
public:
WirelessNetThread(int socketDescriptor, QObject * parent);
void run() Q_DECL_OVERRIDE;
signals:
void error(QTcpSocket::SocketError socketError);
private:
int socketDescriptor;
QString text;
};
class WirelessNet : public QTcpServer
{
Q_OBJECT
public:
WirelessNet(QObject *parent = 0);
protected:
void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
};
还有.cpp
WirelessNetThread::WirelessNetThread(int socketDescriptor, QObject *parent):QThread(parent), socketDescriptor(socketDescriptor)
{
}
void WirelessNetThread::run()
{
QTcpSocket tcpSocket;
if ( !tcpSocket.setSocketDescriptor(socketDescriptor))
{
emit error(tcpSocket.error());
return;
}
tcpSocket.disconnectFromHost();
tcpSocket.waitForDisconnected();
}
WirelessNet::WirelessNet(QObject *parent): QTcpServer(0)
{
listen(QHostAddress::Any, 5220);
printf("is listening %d\n", this->isListening());
}
void WirelessNet::incomingConnection(qintptr socketDescriptor)
{
qDebug() << "incomming \n";
printf("incomming \n");
WirelessNetThread *thread = new WirelessNetThread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
这里是我的主程序的摘录,它是在哪里启动的(顺便说一句,如果我省略 moveToThread() 也没关系:
WirelessNet *wifi = new WirelessNet(this->parent());
wifi->moveToThread(this->thread());
如果我在初始化 wifi 之后添加这些行,即使这样也没有影响:
wifi = new WirelessNet(this->parent());
QEventLoop testLoop;
testLoop.exec();
换句话说,“incomming”永远不会被打印出来,所以我无法继续工作。有谁知道,这几乎是 1:1 的教程中的代码,这让我感到困惑。
【问题讨论】:
-
这段代码来自教程?...你有链接吗? - 它要么很旧,要么写得很糟糕(Qt-wise)。我很难看到“incomingConnection()”是如何被调用的——是否有信号连接到它?但是在你深入这个之前......有很多关于继承线程和启动事件循环的混乱......所有这一切都不是必需的,并且使得遵循和维护非常混乱。我只是在这里发布了一个关于线程的答案:stackoverflow.com/questions/36201769/… - 看看 QThread 的用法
-
.. 为您提供标准 Qt 类之外的 4 行代码,以将其放入线程中。然后您的 WirelessNet 类中的所有代码都可以专注于“无线网络的东西”并且没有线程废话:)。我可以发布一个答案,说明我将如何实现你正在做的事情......但我仍然想念
incomingConnection()的调用方式...... -
@code_fodder 教程的链接在第一行中提到。我对
incomingConnection()有过同样的挣扎。 AFAIU 这个函数是一个被覆盖的函数(即一个虚函数),如果你从QThread继承一个类,它具有与覆盖run()函数类似的机制。不幸的是,我没有时间仔细观察 -
@code_fodder 我用另一个主题中提到的代码尝试了你的方法。我得到了从一个类到另一个类的信号/插槽响应,但是主要问题也没有改变。对
incomingConnection()和SIGNAL(newConnection())仍然没有反应 -
啊,它是一个 TcpServer 覆盖函数,明白了。文档说这个函数(当没有被覆盖时)将发出 newConnection() 信号。我知道你说过你试图捕捉这个信号,但你是否在删除你自己的覆盖函数incomingConnection() 之后尝试这样做? (即使用
connect(myTcpObj, SIGNAL(newConnection()), this (), SLOT(someSlotWithDebugInIt()));之类的东西,我只问您的incomingConnection 有问题(看不到什么)来检查基础是否正常工作。
标签: c++ qt qthread qtcpsocket qtcpserver