我是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
}
如果我这样称呼它,它会读取网页内容,但会执行其余的应用程序块。
如何在不阻止的情况下调用它?
答案 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;
}
这只是一个大纲解决方案;您需要阅读QRunnable
和QThreadPool
的Qt文档,以全面了解您正在做的事情。