Qt线程调用问题

时间:2010-10-01 04:06:37

标签: multithreading qt qt4

请帮帮我。我对线程概念很感兴趣。其实我的问题:我想在组合框中显示城市列表。我从网络服务获取城市列表。我在webserice调用完成后使用线程更新组合框值。

我可以在这里拨打网络服务。但我无法得到答复。

我正在使用以下代码。

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);
}

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);
}

CGNetwork.cpp:

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);
}

1 个答案:

答案 0 :(得分:3)

由于QNetworkAccessManager异步工作,因此不需要单独的线程。您可以直接从主线程中调用getCityList,但不会阻止。

我认为您的广告位未被调用,因为您的QThread::run在其正在进行的任何工作之前返回有机会完成,因为getCityList刚刚发起了http请求而没有等待它(因为QNetworkAccessManager::get不会像我上面说的那样阻止。

另外作为旁注,你的插槽没有获得与相应信号相同的参数,我不记得Qt是否支持这个。