QObject:没有这样的插槽 QThread::readyRead()
QObject: no such slot QThread::readyRead()
我正在尝试弄清楚如何正确使用Qt TCP套接字以及多线程。我希望,作为一个支持更复杂但类似的东西的测试项目,我将在未来尝试执行以下操作:一个简单的应用程序,它要么只侦听一个传入连接,要么连接到服务器套接字;接下来,它打印通过该套接字接收的所有内容。
我连接到服务器套接字的情况(我为此使用带有 -l 选项的 netcat)工作正常:netcat 发送到我的应用程序的所有内容都正确打印。但是,当我使用我的程序侦听那个传入连接(由netcat生成)时,连接成功,但随后出现以下运行时错误:
QObject::connect: No such signal QThread::readyRead() in ..QTcpTestlistener.cpp:8
这是整个代码(不要介意我有时使用的普通C I/O,我稍后会删除它):
[ 主要.cpp ]
#include "peer.h"
#include <QCoreApplication>
#include <QThread>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static bool askIfServer();
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Peer *p;
int rval;
if (askIfServer())
p = new Peer;
else
p = new Peer(false);
rval = a.exec();
delete p;
return rval;
}
static bool askIfServer()
{
bool isServer;
char ibuf[BUFSIZ];
fputs("Choose 'host' or 'join': ", stderr);
fgets(ibuf, BUFSIZ, stdin);
ibuf[strlen(ibuf) - 1] = ' ';
fflush(stdin);
if (strcmp(ibuf, "host") == 0)
isServer = true;
else if (strcmp(ibuf, "join") == 0)
isServer = false;
else
{
fputs("Failure.n", stderr);
exit(-1);
}
return isServer;
}
[ 对等 ]
#ifndef PEER_H
#define PEER_H
#include "listener.h"
#include <QObject>
#include <QThread>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
class Peer : public QObject
{
Q_OBJECT
public:
static const quint16 PORT = 5483;
explicit Peer(bool isHost = true, QString hostname = "localhost", QObject *parent = 0);
public slots:
void acceptPeer();
private:
bool _isHost;
QTcpServer *_server;
QTcpSocket *_socket;
QThread *_lThread;
Listener *_listener;
};
#endif // PEER_H
[ 对等.cpp ]
#include "peer.h"
Peer::Peer(bool isHost, QString hostname, QObject *parent) :
QObject(parent),
_isHost(isHost)
{
if (_isHost)
{
_server = new QTcpServer;
connect(_server, SIGNAL(newConnection()), this, SLOT(acceptPeer()));
_server->listen(QHostAddress::Any, PORT);
}
else
{
_socket = new QTcpSocket;
connect(_socket, SIGNAL(hostFound()), this, SLOT(acceptPeer()));
_socket->connectToHost(hostname, PORT);
}
}
void Peer::acceptPeer()
{
disconnect(this, SLOT(acceptPeer()));
if (_isHost)
{
_socket = _server->nextPendingConnection();
delete _server;
_server = NULL;
}
_lThread = new QThread;
_listener = new Listener(_socket);
_listener->moveToThread(_lThread);
_lThread->start();
}
[ 听众 ]
#ifndef LISTENER_H
#define LISTENER_H
#include <iostream>
#include <QObject>
#include <QByteArray>
#include <QtNetwork/QTcpSocket>
using std::cout;
class Listener : public QObject
{
Q_OBJECT
public:
explicit Listener(QTcpSocket *socket, QObject *parent = 0);
public slots:
void acceptData();
private:
QTcpSocket *_socket;
};
#endif // LISTENER_H
[ 听众.cpp ]
#include "listener.h"
Listener::Listener(QTcpSocket *socket, QObject *parent) :
QObject(parent),
_socket(socket)
{
// I guess this is where it goes wrong
connect(_socket, SIGNAL(readyRead()), this, SLOT(acceptData()), Qt::QueuedConnection);
}
void Listener::acceptData()
{
QByteArray data = _socket->readAll();
cout << data.constData();
}
我没有得到的是错误消息声称我尝试连接来自QThread的一些信号(我显然没有:参见listener.cpp:8);更奇怪的是,这只发生在QTcpServer实例创建套接字时,而不是在其他情况下。我错过了什么?
编辑:已解决
看看我自己的答案。
我不再使用额外的线程(请参阅评论)。问题是在建立连接后删除Peer::acceptPeer()
中的 QTcpServer 实例。我以为我可以删除它,因为我只需要一个QTcpServer::nextPendingConnection()
返回的套接字。显然这是错误的,套接字可能也被破坏了,给我留下了一个流氓指针(我认为)使程序崩溃。现在我只在得到插座后立即打电话给_server->pauseAccepting();
,一切正常。
这是我所做的更改:
void Peer::acceptPeer()
{
disconnect(this, SLOT(acceptPeer()));
if (_isHost)
{
_socket = _server->nextPendingConnection();
_server->pauseAccepting(); // no deletion
}
_listener = new Listener(_socket);
}
相关文章:
- 如何监控QThread
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 等待 qthread 终止的正确方法是什么?
- 如何正确停止运行非循环QThread?
- Valgrind 在 QThread::start() 上报告内存泄漏
- 如何在 QThread 中传递引用
- 使用 QTimer、QThread 和进度条
- 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?
- QThread::create 似乎没有将参数传递给函数
- QSerialPort readyRead() 信号无法正常工作
- QThread::create running on UI Thread
- Qt TcpSocket::readyRead 在特定情况下未触发
- std::condition_variable 在 QThread::run() 中的用法
- QThread moveToThread 不起作用
- QThread start() return value
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 问题 (std::bad_alloc) 通过 QThread 中的 QSqlQuery 将大图像(约 36 MB)保存到
- 如何从 QWizardPage 和访问字段()运行 QThread
- 了解如何在不冻结事件循环的情况下在 QThread 中休眠/等待
- QObject:没有这样的插槽 QThread::readyRead()