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

时间:2016-06-30 09:22:00

标签: c++ multithreading qt libcurl

我是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     
}

如果我这样称呼它,它会读取网页内容,但会执行其余的应用程序块。

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

2 个答案:

答案 0 :(得分:0)

aObject的thread()是线程b,而线程b没有evnet循环.. 你必须在线程中启动事件循环。 如果QObject没有线程关联(即,如果thread()返回零),或者它存在于没有运行事件循环的线程中,则它不能接收排队信号或发布事件。

答案 1 :(得分: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文档,以全面了解您正在做的事情。