Подтвердить что ты не робот

QTimer может использоваться только с потоками, запущенными с QThread

Итак, у меня есть интересная проблема.... программа, которую я пытаюсь написать, сбой с этой ошибкой:

QObject::startTimer: QTimer can only be used with threads started with QThread 

Вещь, которая меня сбивает с толку, - моя программа однопоточная. Целью данного класса является отправка данных POST на php-страницу, которую я имею на моем сервере. Как только он пытается отправить POST, я получаю это сообщение. Вот мой код.

#ifndef TRANSMISSIONS_H
#define TRANSMISSIONS_H
#include "name_spawn.h"
#include <QNetworkReply>
#include <QObject>
#include <QNetworkConfigurationManager>

class Transmissions : public QObject
{
    Q_OBJECT
public:
    Transmissions();
    void Send(GeneratedData);
public slots:
    void serviceRequestFinished(QNetworkReply*);
signals:
    void configurationAdded(const QNetworkConfiguration);
    void configurationChanged(const QNetworkConfiguration);
    void configurationRemoved(const QNetworkConfiguration);
    void onlineStateChanged(bool);
    void updateCompleted();
};

#endif // TRANSMISSIONS_H

И

#include "transmissions.h"
#include "name_spawn.h"
#include <QHttp>
#include <QUrl>
#include <QString>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <iostream>
#include <QNetworkAccessManager>
#include <QNetworkConfigurationManager>
#include <QObject>

using namespace std;

Transmissions::Transmissions()
{
}

void Transmissions::Send(GeneratedData User)
{
    cerr<<"transmitting"<<endl;
    QUrl serviceUrl = QUrl("http://192.168.1.138/postTest.php");
    QByteArray postData;
    QString username="user="+User.Email()+"&";
    QString Passwd="password="+User.pass();
    postData.append(username);
    postData.append(Passwd);

    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    networkManager->post(QNetworkRequest(serviceUrl), postData);
}

void Transmissions::serviceRequestFinished(QNetworkReply *reply)
{
    //this will do other things once post is working
    QString data = reply->readAll();
    cerr <<"Data is "<< data.toStdString()<<endl;

}

Я думаю, что то, что я пытаюсь сделать, довольно просто, но мне не нравится, когда я пытаюсь заставить его работать. Я ничего не видел в документации о QNetworkAccessManager, требующей потоков. Я признаю, что я не очень хорошо знаю Qt, поэтому любая помощь (или ссылки на полные примеры POST) была бы очень оценена.

4b9b3361

Ответ 1

Чтобы использовать QTimer, вам необходимо создать цикл событий. QNAM, очевидно, использует таймер для периодической проверки сетевого ответа.

Вам нужно запустить цикл событий приложения с помощью QCoreApplication::exec(), а затем вызвать методы QNAM, например post.

Я думаю, вы можете называть post до exec, но вы можете встретить эту ошибку.

Также обратите внимание, что до Qt 4.7 QNAM не использовал потоки, но с 4.8 это меняется.

Ответ 2

Это может быть связано с созданием QNetworkAccessManager внутри метода отправки - попробуйте вместо этого использовать RAII.

Определите QNetworkAccessManager в заголовке Transmissions как переменной класса и создайте экземпляр класса в ctor, после чего вы сможете отправить сообщение из потока отправки.

В противном случае я думаю, что это выходит за рамки.