Я придерживался учебника о потоковой qt-networking (который находится здесь: http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html), я внес некоторые незначительные изменения и интегрировал его в свою основную программу. Однако incomingConnection()
никогда не будет выполнен, с другой стороны, клиент может подключиться к. Поскольку я хотел бы работать с incomingConnection(), он устарел, чтобы работать с SIGNAL(newConnection())
, но даже это не работает.QtNetwork: Почему я не обнаруживаю подключаемые соединения? (incomingConnection() никогда не запускается)
Кто-то знает, что происходит не так?
Вот мой .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()», есть ли сигнал, связанный с ним? Но прежде чем вы заходите слишком далеко в этом ... есть много возиться с наследованием потоков и запуском циклов событий ... все это не требуется и делает его очень грязным для наблюдения и поддержки. Я буквально просто разместил ответ на темы здесь: http://stackoverflow.com/questions/36201769/threads-event-loop-in-the-qt-application/36208479#36208479 - посмотрите на использование QThread –
.. для вы добавили 4 строки кода в стандартный класс Qt, чтобы поместить его в поток. Тогда весь код в вашем классе WirelessNet может сосредоточиться на «вещах беспроводной сети» и бессмысленной бессмысленности:). Я мог бы опубликовать ответ с тем, как я буду реализовывать то, что вы делаете ... но мне все еще не хватает, как вызывается 'incomingConnection()' ... –
@code_fodder ссылка на учебник упоминается в самой первой строке , У меня была/была такая же борьба за 'incomingConnection()'. AFAIU эта функция является переопределенной функцией (т. Е. Виртуальной функцией), которая имеет аналогичные механизмы, такие как переопределенная функция 'run()', если вы наследуете класс из 'QThread'.К сожалению, у меня не было времени, чтобы поближе посмотреть – user3085931