Seite 1 von 1

QtNetworking und Downloadbeschränkung

Verfasst: 21. Februar 2018 17:41
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?

Re: QtNetworking und Downloadbeschränkung

Verfasst: 22. Februar 2018 19:21
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
}

Re: QtNetworking und Downloadbeschränkung

Verfasst: 24. Februar 2018 17:36
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);
^
.

Re: QtNetworking und Downloadbeschränkung

Verfasst: 27. Februar 2018 14:56
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);

Re: QtNetworking und Downloadbeschränkung

Verfasst: 2. März 2018 22:30
von dolin93
Vielen Dank!
Nun habe ich die gewünschte Ausgabe erhalten.