Qt 在子线程中通过 QNetworkAccessManager 循环(每间隔 n 秒)发送POST请求

此前项目中有一个模块需要与服务端通讯,通过模拟httpClient 发送POST 请求,由于数据是不断变化的,需要每间隔2秒发一次。 起初我想得很简单,因为此前在Qt 发POST 也干过,想想无非是放在一个循环中 sleep( 2 ) 发一次即可。

但是实际却踩坑了,我在子线程的 run() 中写循环想通过QNetworkAccessManager 发POST , 但实事上这样根本行不通,根本无法接收到返回消息,一步步尝试;在主线程中可以正常发;在子线程中不放入循环可以放;一旦在放在子线程的循环中就无论无何发不出也一直收不到。真是郁闷啊


不废话了,正确的打开方式如下:


   QThread *thread = new QThread(this);
    GCThread *workThread = new GCThread(); //工作线程,具体的业务实现在此中完成,继承自Object    
    workThread->moveToThread( thread );       //加入到子线程
    thread->start();                        //启动线程
    
    threadTimer = new QTimer;
    QObject::connect( threadTimer, SIGNAL(timeout()), workThread, SLOT( work() ),Qt::AutoConnection );
    threadTimer->start( SLEEPSS );   // 计时器,每隔几秒钟唤起工作线程;


工作线程中不需要写成循环,由主线程的计时器每间隔一段时间唤起一次即可;不要写到循环中;

void GCThread::run(){

    work();
}

void GCThread::work(){

    //while( true ){

       SendMessage( ....  );

       // msleep(2000);

    //}


    //qDebug() << "Thread ID: " << QThread::currentThreadId();

}


void GCThread::SendMessage( QString jsonrpc ,QString id ,QString method, QJsonArray params )
{

    qDebug() << "======================= SendMessage === "+ method +" =================================== ";

    QNetworkAccessManager *manager = new QNetworkAccessManager;

    QJsonObject obj;

    obj.insert("jsonrpc", jsonrpc );
    obj.insert("id", id );
    obj.insert("method", method );

    if ( ! params.isEmpty() ){

        obj.insert("params", params );
    }

    QNetworkRequest *request = new QNetworkRequest;
    request->setUrl(QUrl(  "http://localhost:19799/jsonrpc" ) );

    request->setHeader(QNetworkRequest::ContentTypeHeader, "application/json" );

    manager->post( *request, QJsonDocument( obj ).toJson() );


    connect( manager,
             &QNetworkAccessManager::finished,
             this,
             [=](QNetworkReply* reply){

                 this->GCNetworkReply(reply, method );
                 manager->deleteLater();
                 manager->destroyed();
             });

   //
}