在Qt应用程序中正确使用Libcurl

Using Libcurl properly in Qt application

本文关键字:Libcurl Qt 应用程序      更新时间:2023-10-16

我是Qt和libcurl的新手。我现在需要在我的Qt应用程序中使用libcurl。我从:

开始
m_res = curl_easy_perform(m_curl);

然后我发出一个信号,将这个字符串提供给另一个应用程序

emit dataString (QString::fromStdString(dataBufferfromcurl));

我已将此信号连接到其他应用程序中的插槽。但是当调用curl时,它会通过读取数据来阻塞其他程序。有人能建议我如何在Qt应用程序中正确使用licurl吗?

下面是一些更完整的代码:

Class A : public QObject{
void init(){
 if (m_curl){
   curl_easy_setopt(m_curl, CURLOPT_URL, "www.example.com"); 
   curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYPEER, 0L); // enabling ssl 
   curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYHOST, 0L);
   curl_easy_setopt(m_curl, CURLOPT_CONNECTTIMEOUT, 0); 
   curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, WriteCallback);
   curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this);//
}
void process(){
  if (m_curl) {     
    m_res = curl_easy_perform(m_curl);
  }
};
//*************************************************************
class B : QThread{
  Q_OBJECT
public:
  void runProcess(){
    aObject = new A(); 
    ///************ few more connects
    connect(aObject, SIGNAL(connectionError(QString)), this, SLOT(s_fireConnectionError(QString)), Qt::QueuedConnection);
    QTimer::singleShot(1000, workingHTTPReader, SLOT(process()));
  }    
} ;
在C类中,我调用B::runProcess():
void C:: getAllData()
{
    bObject = new B;
    bObject->runProcess(); //***********Problem     
}

如果我这样调用它,它读取网页内容,但执行应用程序的其余部分阻塞。

如何在不阻塞的情况下调用它?

aObject的线程()是线程b,并且线程b没有evnet循环。必须在线程中启动事件循环。如果QObject没有线程关联(也就是说,如果thread()返回0),或者如果它位于一个没有运行事件循环的线程中,那么它就不能接收队列信号或发布事件。

在与应用程序其余部分相同的线程中调用B::runProcess()。创建一个继承自QThread的类不会自动使它的所有方法在不同的线程中运行。

对于您的目的,实现您所追求的最简单的方法是创建一个线程池(或者,更简单地说,使用应用程序的默认线程池),并将您的方法排队在那里执行:

void C:: getAllData()
{
    auto b = new B;
    b->setAutoDelete(true); // if you're not deleting it yourself later
    QThreadPool::globalInstance()->start(hello);   
}

B必须继承QRunnable而不是QThread:

class B : public QRunnable
{
public:
    void run() Q_DECL_OVERRIDE;
}

这只是一个概要解决方案;您需要阅读QRunnableQThreadPool的Qt文档,以充分了解您在做什么。