【问题标题】:QT HTTP Server with Thread带线程的 QT HTTP 服务器
【发布时间】:2014-10-12 17:03:57
【问题描述】:

我编写了一个简单的 HTTP 服务器,它获取一个 PUT 请求处理它并返回一个答案。当我阅读请求文本时一切正常,但是当我写回响应时,我收到这样的警告 QObject: Cannot create children for an parent that is in a different thread。 (Parent是QNativeSocketEngine(0x7ffffe0003950),parent的线程是Htt(0x7fffffffe6f0),当前线程是QThread(0x6128b0) 服务器代码

    #include "Htt.h"

Htt::Htt()
{
}


void Htt::run() {
    m_server = new QTcpServer();

    m_server->listen(QHostAddress::Any, 56789);

    connect(m_server, SIGNAL(newConnection()), SLOT(ConnectClient()));
    exec();
}


void Htt::ConnectClient() {
    m_client = m_server->nextPendingConnection();
    connect(m_client, SIGNAL(readyRead()), SLOT(CitesteDate()));
}


void Htt::ReadData() {
    QByteArray data = m_client->readAll();

    SendRespond();
}


void Htt::SendRespond() {
    QByteArray codSucces = "HTTP/1.1 200 OK\r\n\r\n";


    m_client->write(codSucces);
    m_client->close();
}

这是这个类的标题

#ifndef HTT_H
#define HTT_H

#include <QThread>
#include <QTcpServer>
#include <QTcpSocket>

class Htt : public QThread
{
    Q_OBJECT
private:
    QTcpServer *m_server;
    QTcpSocket *m_client;


    void SendRespond();

private slots:
    void ConnectClient();

    void ReadData();
public:
    Htt();

    void run();
};

#endif // HTT_H

感谢您的帮助!!!

【问题讨论】:

  • 看过了,但不是很懂。在那里我需要创建一个 QThread 类型的对象并在那里移动一个客户端并调用线程的开始,但是线程的 run 方法的实现在哪里?
  • 这只是一种预感。我有这种类型的错误,但在我将 QTcpSocket* 更改为 QTcpSocket 后它消失了。尝试将类中的指针更改为对象。
  • 好的,我今天试试,把结果写出来。谢谢各位!!

标签: c++ multithreading qt http


【解决方案1】:

发生这种情况是因为您从 QThread 派生,这通常是一个错误。

更详细地说:Htt 实例本身存在于您的主线程中。因此,当您创建连接时,您正在将位于子线程(m_server 和 m_client)中的对象连接到位于主线程(Htt 实例)中的对象。这就是为什么连接的槽在主线程而不是子线程中执行。这就是为什么你最终在 SendRespond() 中得到一个错误,抱怨在错误的线程中执行。

在 SO 和网络中搜索。您会发现很多类似的问题,因为您所做的可能是使用 QThread 时最常见的错误。

【讨论】:

  • 我找到你了!我推导出来是因为对我来说这个变体是最容易理解的。现在我将在调用 run 方法后创建 m_client 实例。感谢您的帮助
  • 它工作正常:) 谢谢Silicomancer,你真的帮了我!!!秘诀就是在方法运行后启动服务器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2011-03-08
  • 2014-04-20
  • 2020-12-11
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多