Multithreading 写入QTcpSocket失败,出现不同的线程错误
我创建了一个简单的线程化TCP服务器,它收集从套接字读取的3行数据,然后尝试将它们回显到套接字。下面的函数echoCommand崩溃Multithreading 写入QTcpSocket失败,出现不同的线程错误,multithreading,qt,qthread,qtcpsocket,qiodevice,Multithreading,Qt,Qthread,Qtcpsocket,Qiodevice,我创建了一个简单的线程化TCP服务器,它收集从套接字读取的3行数据,然后尝试将它们回显到套接字。下面的函数echoCommand崩溃 #include "fortunethread.h" #include <QtNetwork> #include <QDataStream> FortuneThread::FortuneThread(int socketDescriptor, QObject *parent) : QThread(parent), socketDe
#include "fortunethread.h"
#include <QtNetwork>
#include <QDataStream>
FortuneThread::FortuneThread(int socketDescriptor, QObject *parent)
: QThread(parent), socketDescriptor(socketDescriptor), in(0)
{
}
void FortuneThread::run()
{
tcpSocketPtr = new QTcpSocket;
if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocketPtr->error());
return;
}
in = new QDataStream(tcpSocketPtr);
connect(tcpSocketPtr, SIGNAL(readyRead()), this, SLOT(readCommand()) );
QThread::exec();
}
void FortuneThread::echoCommand()
{
QString block;
QTextStream out(&block, QIODevice::WriteOnly);
for (QStringList::Iterator it = commandList.begin(); it != commandList.end(); ++it) {
out << "Command: " << *it << endl;
}
out << endl;
tcpSocketPtr->write(block.toUtf8());
tcpSocketPtr->disconnectFromHost();
tcpSocketPtr->waitForDisconnected();
}
void FortuneThread::readCommand()
{
while (tcpSocketPtr->canReadLine())
{
commandList << (tcpSocketPtr->readLine()).trimmed();
}
if (commandList.size() > 2)
{
echoCommand();
}
}
因为我在run()函数中创建了tcpSocketPtr,所以我知道它与这个函数在同一个线程中。为什么套接字写入会失败?我应该指出,写操作是成功的,因为我在telnet窗口上看到了输出…但是套接字写操作仍然失败
更多信息…我发现我不应该在QThread中放置插槽..不确定如何解决此问题,但下面是我的类定义:
class FortuneThread : public QThread
{
Q_OBJECT
public:
FortuneThread(int socketDescriptor, QObject *parent);
void run();
signals:
void error(QTcpSocket::SocketError socketError);
private slots:
void readCommand();
private:
void echoCommand();
int socketDescriptor;
QDataStream *in;
QStringList commandList;
QTcpSocket *tcpSocketPtr;
};
如何在run方法中创建指针?你能给我看一下相关的线路吗?这个tcpSocketPtr是您的FortuneThread类的成员吗?是的-FortuneServer.h文件定义了这个类,并且有私有成员:“QTcpSocket*tcpSocketPtr;”我们需要查看更多代码,Michelle。如何将插槽连接到其信号,如何准确构造堆对象等?我添加了第二个文件,用于启动线程并连接第一个插槽/信号,而第一个文件(运行中)连接readyRead的插槽/信号。建议不要继承
QThread
类<代码>QThead*T1=新的QThread();T1->start();对象->移动到线程(T1)代码>更好
**QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x7f19cc002720), parent's thread is FortuneThread(0x25411d0), current thread is QThread(0x220ff90)**
class FortuneThread : public QThread
{
Q_OBJECT
public:
FortuneThread(int socketDescriptor, QObject *parent);
void run();
signals:
void error(QTcpSocket::SocketError socketError);
private slots:
void readCommand();
private:
void echoCommand();
int socketDescriptor;
QDataStream *in;
QStringList commandList;
QTcpSocket *tcpSocketPtr;
};