【问题标题】:Using Libcurl properly in Qt application在 Qt 应用程序中正确使用 Libcurl
【发布时间】:2016-11-02 07:11:46
【问题描述】:

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

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

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

【问题讨论】:

  • 谷歌:Qt::QueuedConnection。或者使用多线程。不清楚,你有什么问题。 stackoverflow.com/help/how-to-ask
  • 嗨@DmitrySazonov 感谢您的回复。而且我已经厌倦了“Qt::Directconnection”和“Qt::Queued connection”。 .我已经稍微清楚地解释了我的问题。请看一下。
  • 使用任何 QThread / QThreadPool / QtConcurrent 进行异步操作。
  • 你能给我一些这样的例子吗?以便我能更好地理解。提前致谢
  • 不,因为 stackoverflow 不是免费的编码服务。你需要自己做一个研究。因为网上有很多例子。

标签: c++ multithreading qt libcurl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您在与应用程序其余部分相同的线程中调用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 文档,以全面了解您在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多