Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中的不同线程上发送get/post请求_C++_Multithreading_Qt - Fatal编程技术网

C++ 在Qt中的不同线程上发送get/post请求

C++ 在Qt中的不同线程上发送get/post请求,c++,multithreading,qt,C++,Multithreading,Qt,我正在用Qt开发一个应用程序,需要从我的客户机向另一台服务器发送异步post/get请求。我的应用程序已经有一个线程,我想用它自己的事件循环创建一个不同的线程来发送post/get请求 有可能这样做吗 子类化QThread 在子类的重新实现的run方法中启动事件循环 有发送请求的方法吗 提前谢谢 您不需要做任何事情,因为QNetworkAccessManger异步发出所有请求。 阅读更多内容您必须记住,QObject具有线程关联,它是在实例化“where”对象时获得的。这意味着,如果没有创建事件

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

有可能这样做吗

  • 子类化QThread
  • 在子类的重新实现的run方法中启动事件循环
  • 有发送请求的方法吗
    提前谢谢

    您不需要做任何事情,因为QNetworkAccessManger异步发出所有请求。
    阅读更多内容

    您必须记住,QObject具有线程关联,它是在实例化“where”对象时获得的。这意味着,如果没有创建事件循环,Qt不知道从对象线程以外的另一个线程接收事件(和信号)。更多信息,请看这个

    一个好方法是创建一个实现逻辑的类,并将其实例化为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的每个事件或信号都将“跳转”到要处理的线程


    我希望这会对您有所帮助。

    谢谢您的回答。我只需要有一个事件循环来使用QNetworkAccessManager。我想用这个事件循环创建另一个线程。我可以创建一个类来处理网络,并使用新的事件循环将该对象移动到该线程吗?很可能您的主线程中已经有一个事件循环。我确实有一个事件循环,但它不是基于qt的。这就是为什么要创建另一个具有新事件循环的线程。QNetworkAccessManager不需要另一个线程。它将在你的主线程工作良好。如果愿意的话,您只需要调用post/get方法和slot来接收回复。整个工作将在另一个线程中完成,主线程将只接收结果。那么,为什么要使用qt?我如何创建和删除ThreadClass?我可以让它永远与应用程序的主线程一起运行吗?@user3065039 ThreadClass与其他任何类一样。它确实是当前操作系统中线程的包装器。我已经添加了如何使用它。你也可以使用。这样您就根本不必为
    QThread
    创建子类。您还应该在调用
    QThread::quit()
    后等待线程完成,然后再删除它。我想在我的应用程序中有两个永久线程。一个是做事情的线程,另一个是负责网络请求的永久线程。这个应用程序是一个守护进程,所以我需要一个网络线程来一直工作。Jairo想问你。我在模板中或多或少地实现了类似的功能。我有一个WorkerClass,它里面有QnetworkAccessManager,在构造函数中我以这种方式连接(&manager,SIGNAL(finished(QNetworkReply*)),slotFinished(QNetworkReply*));我的问题是以后如何在QNetworkReply中收集回复