Multithreading Qt线程调用问题

Multithreading Qt线程调用问题,multithreading,qt,qt4,Multithreading,Qt,Qt4,请帮帮我。我被线程概念迷住了。实际上我的问题是:我想在组合框中显示城市列表。我正在从网络服务获取城市列表。我正在使用线程在webserice调用完成后更新组合框值 在这里,我可以调用Web服务。但是我没有得到答复 我正在使用以下代码 MainWindow.cpp: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { CGNetwork *cgNetw

请帮帮我。我被线程概念迷住了。实际上我的问题是:我想在组合框中显示城市列表。我正在从网络服务获取城市列表。我正在使用线程在webserice调用完成后更新组合框值

在这里,我可以调用Web服务。但是我没有得到答复

我正在使用以下代码

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    CGNetwork *cgNetwork = new CGNetwork();
    ui->setupUi(this);

    renderThread = new RenderThread(cgNetwork);
    renderThread->start();

    connect(renderThread,SIGNAL(finished()),this,SLOT(initControls()));
}

void MainWindow::initControls()
{
    CGMainWindowUtility *pointer = CGMainWindowUtility::instance();
    QStringList cityitems;
    cityitems <<tr("All");
    cityitems.append(pointer->getCityList());
    QStringListModel *cityModel = new QStringListModel(cityitems, this);
    ui->cityComboBox->setModel(cityModel);
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
CGNetwork*CGNetwork=new CGNetwork();
用户界面->设置用户界面(此);
renderThread=新的renderThread(cgNetwork);
RenderRead->start();
连接(renderThread,SIGNAL(finished()),this,SLOT(initControls());
}
void MainWindow::initControls()
{
CGMainWindowUtility*指针=CGMainWindowUtility::instance();
QStringList城市项目;
cityitems cityComboBox->setModel(cityModel);
}
RenderThread.cpp:

RenderThread::RenderThread(CGNetwork *cgnetwork)
{
    cityUrl = "http://112.138.3.181/City/Cities";
    categoryUrl = "http://112.138.3.181/City/Categories";    
}

void RenderThread::run()
{
    qDebug()<< "THREAD Started";
    CGNetwork *cgnetworks = new CGNetwork();
    cgnetworks->getCityList(cityUrl);
}
void CGNetwork ::getCityList(const QUrl url)
{
    cityGuideNetworkAccessManager = new QNetworkAccessManager(this);
    qDebug()<<"connection";

    connect(cityGuideNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseCityList()));

    const QNetworkRequest cityRequest(url);
    cityReply= cityGuideNetworkAccessManager->get(cityRequest);

    connect(cityReply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slotError()));
}

void  CGNetwork::parseCityList()
{
    qDebug()<<"Parsing";
    cgParser = new CGJsonParser();
    cgParser->CityRead(cityReply);
}
RenderThread::RenderThread(CGNetwork*CGNetwork)
{
城市URL=”http://112.138.3.181/City/Cities";
类别URL=”http://112.138.3.181/City/Categories";    
}
void RenderThread::run()
{
qDebug()获取城市列表(cityUrl);
}
CGNetwork.cpp:

RenderThread::RenderThread(CGNetwork *cgnetwork)
{
    cityUrl = "http://112.138.3.181/City/Cities";
    categoryUrl = "http://112.138.3.181/City/Categories";    
}

void RenderThread::run()
{
    qDebug()<< "THREAD Started";
    CGNetwork *cgnetworks = new CGNetwork();
    cgnetworks->getCityList(cityUrl);
}
void CGNetwork ::getCityList(const QUrl url)
{
    cityGuideNetworkAccessManager = new QNetworkAccessManager(this);
    qDebug()<<"connection";

    connect(cityGuideNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseCityList()));

    const QNetworkRequest cityRequest(url);
    cityReply= cityGuideNetworkAccessManager->get(cityRequest);

    connect(cityReply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slotError()));
}

void  CGNetwork::parseCityList()
{
    qDebug()<<"Parsing";
    cgParser = new CGJsonParser();
    cgParser->CityRead(cityReply);
}
void CGNetwork::getCityList(const QUrl url)
{
cityGuideNetworkAccessManager=新的QNetworkAccessManager(此);

qDebug()由于
QNetworkAccessManager
是异步工作的,因此不需要单独的线程。您可以直接从主线程调用
getCityList
,它不会阻塞

我认为之所以没有调用您的插槽,是因为您的
QThread::run
在其所做的任何工作有机会完成之前返回,因为
getCityList
只是启动了一个http请求而没有等待它(因为
QNetworkAccessManager::get
没有像我上面所说的那样阻塞)


另外,作为补充说明,您的插槽没有获得与其相应信号相同的参数,我不记得Qt是否支持此功能。

Hi,我在RenderThread.cpp和mainwindow.cpp mainwindow.cpp[code]cgNetwork->moveToThread(RenderThread);[/code]RenderThread.cpp[code]void RenderThread::run()中稍微更改了代码{qDebug()getCityList(cityUrl);cgnetworks->getCategoryList(categoryUrl);emit(finished());exec();}[/code]现在,我可以解析结果了。但是问题是,线程在解析完成之前完成了…组合框仍然是空的。如何避免这种情况?请帮助我。。。