Qt多线程之一:子线程中创建的对象不应再其他线程中被调用,包括使用槽函数的形式

来源:互联网 发布:手机淘宝安全中心官网 编辑:程序博客网 时间:2024/06/16 21:21
#define WORKTHREAD_H#include <QThread>#include "DataBaseObject.h"#include "HttpObject.h"#include <QStringList>class WorkThread:public QThread{    Q_OBJECTpublic:    WorkThread(QThread *parent = 0);    ~WorkThread();signals:    void next();private slots:    void singleOperatre();protected:    void run();private:    DataBaseObject *db;    HttpObject *http;    bool exitFlag;    QStringList city_code_list;    int index;    int max;    QString url;    QString fixedPartOfUrl;    QString urlParam;};#endif // WORKTHREAD_H
<pre name="code" class="html">#include "workthread.h"#include <QDebug>WorkThread::WorkThread(QThread *parent):    QThread(parent){    db = NULL;    http = NULL;    exitFlag = false;    index = 0;    city_code_list.clear();}WorkThread::~WorkThread(){    db->closeDB();    delete db;    delete http;}void WorkThread::singleOperatre()//这个函数其实是在主线程中被调用,而不是新建的这个线程,虽然其调用的对象是在子线程中创建的{    if(index < max)    {        urlParam = city_code_list.at(index);        qDebug()<<urlParam;        url = fixedPartOfUrl + urlParam;        http->getRequest(url);        index++;        qDebug()<<"\n thread ID:"<<QThread::currentThreadId()<<QThread::currentThread()<<__FUNCTION__<<"index:"<<index;//        msleep(10);//        emit next();    }}void WorkThread::run(){    qDebug()<<QThread::currentThreadId()<<__FUNCTION__<<QThread::currentThread();    fixedPartOfUrl = "http://apis.baidu.com/apistore/weatherservice/cityid?cityid=";    db = new DataBaseObject;    http = new HttpObject;    connect(http,SIGNAL(weatherGetted(WEATHER_CITY)),db,SLOT(addCityWeather(WEATHER_CITY)));//    connect(this,SIGNAL(next()),this,SLOT(singleOperatre()),Qt::QueuedConnection);    db->setDataBase("127.0.0.1",3306,"weather_db","user","123456");    db->openDB();    max = db->getCityCode(city_code_list);    qDebug()<<"city num:"<<max<<endl;    emit next();//    singleOperatre();    exec();}


</pre><pre code_snippet_id="1729225" snippet_file_name="blog_20160625_5_2648402" name="code" class="html">void WorkThread::singleOperatre()//这个函数其实是在主线程中被调用,而不是新建的这个线程,虽然其调用的对象是在子线程中创建的
<p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:10pt; color:#aa00aa;">QObject: Cannot create children for a parent that is in a different thread.</span></p><p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:10pt; color:#aa00aa;">(Parent is QNetworkAccessManager(0x66a928), parent's thread is WorkThread(0x780eb0), current thread is QThread(0x667658)</span></p>

                                             
0 0
原创粉丝点击