QtNetworking und Downloadbeschränkung

Alles rund um die Programmierung mit Qt
Antworten
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

QtNetworking und Downloadbeschränkung

Beitrag von dolin93 »

Hallo,
wenn es für eine API heißt
Logged-In Free Users 2000 calls / 10 minutes 50,000 calls / day 1 call + additional 1 call in the queue
dann müßte man doch mit einem Programm mehr als 2 Calls machen können, weil sonst die Beschränkung 2000 calls / 10 minutes überflüssig wäre, da man manuell nie soviel schaffen würde.Wenn mein filedownloader

Code: Alles auswählen

 FileDownloader::FileDownloader( const QUrl &KUrl) : kUrl(KUrl)
   {
       connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)),
                   SLOT(fileDownloaded(QNetworkReply*)));
       QNetworkRequest request(kUrl);
       m_WebCtrl.get(request);
       //connect(SIGNAL(finished(QNetworkReply*)),
             //     SLOT(transmit(QList<QByteArray>)));

   }

   FileDownloader::~FileDownloader()
   {

   }

   void FileDownloader::fileDownloaded(QNetworkReply* pReply)
   {   for(int I=0;I<15;I++)                  
       {m_DownloadedData+= pReply->readLine(); 
   }                                          
       pReply->deleteLater();
       emit downloaded();
       qDebug("m_DownloadedData");
       qDebug(m_DownloadedData); 
       QString row4;
       row4=m_DownloadedData;
      // qDebug("row4");
      // qDebug(qPrintable(row4)); //funktioniert
nacheinander für AAPL und MSFT aufgerufen wird, erhalte ich die gewünschten Werte. Wenn aber von main.cpp aus filedownloader.cpp nacheinander für AAPL, MSFT und F aufgerufen wird, so erhalte keine Daten mehr, sondern die Fehlermeldung
code,message
QEPx04,You do not have permission to view this dataset.
. Einfügen von

Code: Alles auswählen

QThread::sleep(62);
bringt verständlicherweise auch nichts. Weiß jemand, wie man vorgehen muß, damit nicht die Beschränkung auf 2 Calls, sondern die auf 2000 calls / 10 minutes wirksam wird?
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: QtNetworking und Downloadbeschränkung

Beitrag von hilefoks »

2000 Calls in 10 Minuten, also alle 300 Millisekunden eine neue Anfrage, ist auch sequenziell leicht machbar. Ein Server sollte locker 1000 Anfragen pro Sekunde verarbeiten (siehe auch C10K Problem). Als nicht zahlender Kunde wollen sie dich nur noch etwas weiter dengeln, - deshalb die max. 2 parallele Calls.

Beide Beschränkungen sind also gültig!

Am einfachsten kannst du mit diesem Problem umgehen, wenn du tatsächlich nur eine Anfrage zur Zeit laufen hast. Grob etwa so:

Code: Alles auswählen

FileDownloader::FileDownloader(const QList<QUrl> &KUrl) 
  : kUrl(KUrl)
{
    connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), SLOT(fileDownloaded(QNetworkReply*)));
    makeRequest();
}

void fileDownloaded::makeRequest()
{
    if(kUrl.isEmpty()) {
        qDebug() << "done";
        return;
    }
    
    QNetworkRequest request(kUrl.takeFirst());
    m_WebCtrl.get(request);
}

void FileDownloader::fileDownloaded(QNetworkReply* pReply)
{
    //... 
    
    makeRequest(); // start next request
}
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: QtNetworking und Downloadbeschränkung

Beitrag von dolin93 »

Vielen Dank für Deine Hilfe.
Wenn sich in der Liste, die an die neue filedownloader.cpp

Code: Alles auswählen

#include "filedownloader.h"
#include <iostream>
#include <QtDebug>
#include <QList>


FileDownloader::FileDownloader(const QList<QUrl> &KUrl) : kUrl(KUrl)
{
    connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), SLOT(fileDownloaded(QNetworkReply*)));
    makeRequest();
}
FileDownloader::~FileDownloader()
{

}

void FileDownloader::makeRequest()
{
    if(kUrl.isEmpty()) {
        qDebug() << "done";
        return;
    }

    QNetworkRequest request(kUrl.takeFirst());
    m_WebCtrl.get(request);    
}

void FileDownloader::fileDownloaded(QNetworkReply* pReply)
{  for(int I=0;I<15;I++)
    {m_DownloadedData+= pReply->readLine();}
    //...
    pReply->deleteLater();
    emit downloaded();
    //QThread::sleep(62);
        qDebug("m_DownloadedData");
        qDebug(m_DownloadedData);

    makeRequest(); // start next request
}
übergeben wird, 3 Elemente befinden, dann erhalte ich die Werte für die ersten beiden Elemente der Liste und die Fehlermeldung
code,message
QEPx04,You do not have permission to view this dataset.
. Bei 4 Elementen erhalte ich auch wieder die Ausgabe für die ersten beiden Elemente und zweimal diese Fehlermeldung. Mit meiner ursprünglichen Fassung erhielt ich gar keine Werte mehr für mehr als 2 Calls. Also gab es eine kleine Verbesserung. Ich wollte es noch mit der sleep()-Anweisung probieren, aber leider meldet dann der Compiler
/filedownloader.cpp:34: Fehler: incomplete type 'QThread' used in nested name specifier
QThread::sleep(62);
^
.
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: QtNetworking und Downloadbeschränkung

Beitrag von hilefoks »

Du hast den include für QThread vergessen. Allerdings ist das benutzen von sleep kein guter Stil und auf dem Main-Thread blockiert es sogar die UI.
Es gibt aber eine andere einfache Lösung. Ersetze den Aufruf von makeRequest durch:

Code: Alles auswählen

QTimer::singleShot(100, this, &FileDownloader::makeRequest);
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: QtNetworking und Downloadbeschränkung

Beitrag von dolin93 »

Vielen Dank!
Nun habe ich die gewünschte Ausgabe erhalten.
Antworten