Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ QNAM + QTHREAD

Автор: prokoder 16.5.2011, 13:59

Задача: Есть файл

Цитата
параметр 1
параметр 2
параметр 3
...
параметр n

Надо с каждым параметром сделать запрос типа
http://yandex.ru/yandsearch?text=параметр 1

И результат сохранить в файл.
Задача для меня простая, но появилась необходимость прикрутить многопоточность...С этой темой у меня всегда было туго,никак не могу в ней разобраться. Взял пример из этой статьи http://ufna.ru/2010/10/27/qt-qnetworkaccessmanager-multithread
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QMutex>

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>

//--------------------------------------------------------------------------------------
// Name: cUUploadThread
// Desc:
//--------------------------------------------------------------------------------------
class cUUploadThread : public QThread
{
    Q_OBJECT

public:
    // Constructor
    //----------------------------------------------------------------------------------
    cUUploadThread(QObject *parent);
    ~cUUploadThread();

    // Control
    //----------------------------------------------------------------------------------
    void processTask(/* your data */);

private:
    // Internal data
    //----------------------------------------------------------------------------------
    bool m_abort;

    QMutex mutex;
    QNetworkAccessManager *pManager;

    // External data
    //----------------------------------------------------------------------------------
    volatile int i;
signals:
    // Send data
    //----------------------------------------------------------------------------------
    void sendPermit();

public slots:
    // Internal control
    //----------------------------------------------------------------------------------
    void sendPart();

    // Control thread
    //----------------------------------------------------------------------------------
    void playTask();
    void stopProcess();

    // Upload control
    //----------------------------------------------------------------------------------
    void slotReadyRead();
    void slotError(QNetworkReply::NetworkError);
    void slotFinished();
    void slotUploadProgress( qint64 bytesSent, qint64 bytesTotal);

    //================================================================================
==

protected:
    // Start it
    //----------------------------------------------------------------------------------
    void run();

};

#endif // MYTHREAD_H


MyThread.cpp
#include "MyThread.h"

#include <QDebug>

//--------------------------------------------------------------------------------------
// cUUploadThread class constructor
//--------------------------------------------------------------------------------------
cUUploadThread::cUUploadThread(QObject *parent) :
    QThread(parent)
{
    // Nullifing data
    m_abort = false;

    pManager = 0;
}

// cUUploadThread class destructor
//--------------------------------------------------------------------------------------
cUUploadThread::~cUUploadThread()
{
    qDebug() << "cUUploadThread::~cUUploadThread()";

    mutex.lock();
    m_abort = true;
    mutex.unlock();

    wait();
}

//=============================================================================
// MAIN
//=============================================================================

// Processing the dot
//--------------------------------------------------------------------------------------
void cUUploadThread::processTask(/* your data */)
{
    qDebug() << "cUUploadThread::processTask()";

    mutex.lock();
    m_abort = false;
    mutex.unlock();

    /*
        ADD YOUR DATA FOR TASK
    */
}

// Run thread
//--------------------------------------------------------------------------------------
void cUUploadThread::run()
{
    qDebug() << "cUUploadThread::run()";

    mutex.lock();
    m_abort = false;
    mutex.unlock();

    /// IT IS THE MAIN IDEA OF MULTITHREADED APP WITH QNETWORK
    // first part sending
    connect(this, SIGNAL(sendPermit()), SLOT(sendPart()));
    emit(sendPermit());

    // enter main loop
    exec();

    qDebug() << "cUUploadThread::run() end";
}

//--------------------------------------------------------------------------------------
void cUUploadThread::sendPart()
{

    if( !pManager )
        pManager = new QNetworkAccessManager();

    QNetworkRequest request;
    request.setUrl(QUrl("http://yandex.ru/"));
    /*
        MAKE TRUE REQUEST
    */

    QNetworkReply *reply = pManager->get(request);

    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(uploadProgress(qint64,qint64)),
            this, SLOT(slotUploadProgress(qint64,qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));

    qDebug() << "cUUploadThread::sendPart() OK";
}

//=============================================================================
// PUBLIC SLOTS
//=============================================================================

//--------------------------------------------------------------------------------------
void cUUploadThread::playTask()
{
    qDebug() << "cUUploadThread::playTask()";

    mutex.lock();
    m_abort = true;
    mutex.unlock();

    start();
}

// Stop thread if needable
//--------------------------------------------------------------------------------------
void cUUploadThread::stopProcess()
{
    qDebug() << "cUUploadThread::stopProcess()";

    mutex.lock();
    m_abort = true;
    mutex.unlock();

    exit(0);
    wait();

    qDebug() << "PROCESS STOPPED";
}

//--------------------------------------------------------------------------------------
void cUUploadThread::slotReadyRead()
{
    qDebug() << "cUUploadThread::slotReadyRead()";
}

//--------------------------------------------------------------------------------------
void cUUploadThread::slotError(QNetworkReply::NetworkError error)
{
    qDebug() << "cUUploadThread::slotError("
            << error << ")";

    stopProcess();
}

//--------------------------------------------------------------------------------------
void cUUploadThread::slotFinished()
{
    qDebug() << "cUUploadThread::slotFinished()";

    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    reply->deleteLater();

    if( reply->bytesAvailable() > 0 ) {
        QString reply_str(reply->readAll());
        qDebug() << reply_str;
    }
    else {
        qDebug() << "NO DATA TO READ";
        stopProcess();
    }

    qDebug() << "DATA OK";
}

//--------------------------------------------------------------------------------------
void cUUploadThread::slotUploadProgress( qint64 bytesSent, qint64 bytesTotal)
{
    qDebug() << bytesSent << bytesTotal;
}


main.cpp
cUUploadThread *tr=new cUUploadThread(0);
        tr->playTask();


Насчет запуска потоков в этой статье не сказано, поэтому начал импровизировать...правильно запустил поток?Как запустить к примеру 50 потоков?Как распределить параметры из файла,чтобы они в потоках не дублировались и вообще как реализовать доставку этих параметров в потоки?Никак не могу вкурить как это работает... :blink:

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)