Проблемы с вызовом потока Qt - PullRequest
2 голосов
/ 01 октября 2010

Пожалуйста, помогите мне.Я поражен концепцией потока.Собственно моя проблема: я хочу отобразить Список городов в выпадающем списке.Я получаю список городов из веб-сервиса.Я использую поток для обновления значения поля со списком после завершения вызова веб-службы.

Здесь я могу позвонить в веб-сервис.Но я не смог получить ответ.

Я использую следующий код.

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 Ответ

3 голосов
/ 01 октября 2010

Поскольку QNetworkAccessManager работает асинхронно, нет необходимости в отдельном потоке. Вы можете позвонить getCityList прямо из основного потока, и он не будет блокироваться.

Я думаю, что ваши слоты не были вызваны, потому что ваш QThread::run возвратился до того, как какая-либо работа, которую он выполнял, имела возможность выполнить, так как getCityList просто инициировал запрос http, не ожидая его (потому что QNetworkAccessManager::get не делает не блокируйте, как я сказал выше).

Также, как примечание: ваши слоты не получают те же параметры, что и соответствующие им сигналы, я не помню, поддерживает ли это Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...