为什么QT和libcurl中编程的exe每次执行的结果都不同?
我想用libcurl编写一个Qt程序 标题如下:为什么QT和libcurl中编程的exe每次执行的结果都不同?,qt,libcurl,qthread,Qt,Libcurl,Qthread,我想用libcurl编写一个Qt程序 标题如下: class WorkThread : public QThread { Q_OBJECT public: //... void work(QString url_); static size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp); protected: void run(); private
class WorkThread : public QThread
{
Q_OBJECT
public:
//...
void work(QString url_);
static size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp);
protected:
void run();
private:
QString url;
};
源代码:
//....
void WorkThread::work(QString url_)
{
url=url_;
start();
}
void WorkThread::run()
{
CURL *curl;
CURLcode res;
char buffer[512];
curl = curl_easy_init();
if(curl) {
char *liburl=url.toLatin1().data();
curl_easy_setopt(curl, CURLOPT_URL, liburl);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WorkThread::callback_get_head);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
printf("curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
printf("%s \n",buffer);
}
}
size_t WorkThread::callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
{
strcat( (char*)(userp), (char*)(ptr));
return size * nmemb;
}
大体上:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WorkThread thread1;
WorkThread thread2;
WorkThread thread3;
thread1.work("http://hq.sinajs.cn/list=sh601006");
thread2.work("http://hq.sinajs.cn/list=sh601006");
thread3.work("http://hq.sinajs.cn/list=sh601006");
return a.exec();
}
当我编译和运行时,我发现每次的结果都是不同的。怎么了?上面说“名称解析失败”。但似乎名称解析在thread1和thread2中成功了。问题是您没有正确使用QThread。除非您要改变Qt处理线程的方式,否则您不应该继承它 尽管Curl对象的线程关联是新线程,但主对象具有主线程的线程关联 将Curl代码分离到一个单独的类中,继承自QObject,然后将其移动到新线程。这应该可以解决你看到的问题
解释如何正确使用QThread。为什么不使用Qt网络?它更方便、更异步(无需创建线程)。
char*liburl=url.toLatin1().data()
-这很危险,liburl的内容在语句结束后未定义。使用常量QByteArray liburl=url.toLatin1()然后在libcurl调用中调用liburl.constData()
。还要确保libcurl在使用它的上下文中是线程安全的。因为我发现QtNetwork不够快。我听说libcurl更快。我使用const QByteArray liburl=url.toLatin1();但是,它不起作用。