Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么QT和libcurl中编程的exe每次执行的结果都不同?_Qt_Libcurl_Qthread - Fatal编程技术网

为什么QT和libcurl中编程的exe每次执行的结果都不同?

为什么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

我想用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:
      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()liburl.constData()。还要确保libcurl在使用它的上下文中是线程安全的。因为我发现QtNetwork不够快。我听说libcurl更快。我使用const QByteArray liburl=url.toLatin1();但是,它不起作用。