【发布时间】: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