【问题标题】:Sending get/post requests on a different thread in Qt在 Qt 的不同线程上发送 get/post 请求
【发布时间】:2026-02-10 13:10:01
【问题描述】:

我正在 Qt 中开发一个应用程序,我需要将异步 post/get 请求从我的客户端发送到另一台服务器。我的应用程序已经有一个线程,我想用自己的事件循环创建一个不同的线程来发送 post/get 请求。

是否可以使用

  1. 继承 QThread,
  2. 在重新实现的子类的 run 方法中启动事件循环,
  3. 有发送请求的方法吗?

提前致谢。

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:

    您不需要做任何事情,因为 QNetworkAccessManger 会异步发出所有请求。 阅读更多http://qt-project.org/doc/qt-4.7/qnetworkaccessmanager.html

    【讨论】:

    • 感谢您的回答。我只需要一个事件循环来使用 QNetworkAccessManager。我想用事件循环创建另一个线程。我可以创建负责网络的类并使用新的事件循环将该对象移动到该线程吗?
    • 你的主线程中可能已经有一个事件循环
    • 我确实有一个事件循环,但它不是基于 qt 的。这就是为什么要创建另一个带有新事件循环的线程。
    • 您不需要为 QNetworkAccessManager 设置另一个线程。它会在你的主线程中正常工作。如果您愿意,只需将其称为 post/get 方法和接收回复的插槽。整个工作将在另一个线程中完成,主线程将收到结果。
    • 那么,为什么要使用qt呢?
    【解决方案2】:

    您必须记住,QObject 具有线程亲和性,即它在“哪里”对象被实例化。这意味着如果没有创建事件循环,Qt 不知道来自另一个线程而不是对象线程的接收事件(和信号)。看看这个link 了解更多信息。

    一个好方法是创建一个实现你的逻辑的类,并将其实例化为 QThread 的特定子类的 run 方法。让我用代码解释一下:

    class WorkerClass : public QObject
    {
       // Your logic
      public slots:
         void doWork();
    };
    
    class ThreadClass : public QThread
    {
       WorkerClass*  m_worker;
       WorkerClass*  getWorker();
       ...
       void run()
       {
          // A new thread is created
          WorkerClass instance; // Get thread affinity
          m_worker = &instance;
          exec(); // Start event loop
          m_worker = 0;
       }
       ....
    };
    
    int main(int argc, char* argv[])
    {
       QCoreApplication app(arc, argv);
       ThreadClass pThread = new ThreadClass();
       pThread->start();
       pThread->getWorker()->doWork(); // do work into worker's thread
    
       // Other tasks
    
       pThread->quit();
       delete pThread;
    
       app.quit();
    }
    

    发送到 WorkerClass 的每个事件或信号都会“跳转”到其线程进行处理。

    希望对你有所帮助。

    【讨论】:

    • 我如何创建和删除 ThreadClass?我可以让它在应用程序的主线程中永远运行吗?
    • @user3065039 ThreadClass 与任何其他类一样。它确实是您当前操作系统中线程的包装器。我已经添加了如何使用它。
    • 您也可以使用QObject::moveToThread。那么你就不必继承QThread 了。您还应该在调用QThread::quit() 之后等待线程完成,然后再删除它。
    • 我想在我的应用程序中有 2 个永久线程。一个负责处理事情,另一个负责网络请求的永久线程。该应用程序是一个守护进程,所以我需要联网线程才能一直工作。
    • Jairo 想问你。我或多或少地在模板中实现了。我有 WorkerClass,它里面有 QnetworkAccessManager 并且在构造函数中我以这种方式连接 connect(&manager, SIGNAL(finished(QNetworkReply*)), SLOT(slotFinished(QNetworkReply*)));我的问题是我以后如何收集 QNetworkReply 中的回复