在Qt应用程序中正确使用Libcurl
Using Libcurl properly in Qt application
我是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;
}
这只是一个概要解决方案;您需要阅读QRunnable
和QThreadPool
的Qt文档,以充分了解您在做什么。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 发送一个带有libcurl C++问题的帖子请求:s
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- libCURL:上传数据崩溃(Qt,SMTP)
- 在QT中链接libCurl会给出一个庞大的C++错误列表
- 如何在Windows上静态链接到Qt中的libcUrl
- 在Qt应用程序中正确使用Libcurl