Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading QTimer只能用于以QThread启动的线程_Multithreading_Qt_Post - Fatal编程技术网

Multithreading QTimer只能用于以QThread启动的线程

Multithreading QTimer只能用于以QThread启动的线程,multithreading,qt,post,Multithreading,Qt,Post,因此,我有一个有趣的问题……我正在(尝试)编写的程序因以下错误而崩溃: QObject::startTimer: QTimer can only be used with threads started with QThread 让我困惑的是我的程序是单线程的。这个类的目标是将POST数据发送到服务器上的php页面。当它试图发送邮件时,我收到了这个消息。这是我的密码 #ifndef TRANSMISSIONS_H #define TRANSMISSIONS_H #include "name_

因此,我有一个有趣的问题……我正在(尝试)编写的程序因以下错误而崩溃:

QObject::startTimer: QTimer can only be used with threads started with QThread 
让我困惑的是我的程序是单线程的。这个类的目标是将POST数据发送到服务器上的php页面。当它试图发送邮件时,我收到了这个消息。这是我的密码

#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
\ifndef变速箱
#定义变速箱
#包括“name_spawn.h”
#包括
#包括
#包括
类传输:公共QObject
{
Q_对象
公众:
传输();
无效发送(生成数据);
公众时段:
作废serviceRequestFinished(QNetworkReply*);
信号:
添加了无效配置(常量QNetworkConfiguration);
无效配置已更改(常量QNetworkConfiguration);
已删除无效配置(const QNetworkConfiguration);
无效onlineStateChanged(bool);
void updateCompleted();
};
#endif//TRANSMISSIONS\u H

#包括“transmissions.h”
#包括“name_spawn.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
传输::传输()
{
}
无效传输::发送(生成数据用户)
{

cerr这可能与在Send方法中创建QNetworkAccessManager有关-请尝试使用RAII

将传输头中的QNetworkAccessManager定义为类变量,并在ctor中创建一个类实例,然后您将能够从发送线程发布到它


否则我认为它超出了范围。

要使用
QTimer
您需要一个事件循环。QNAM显然使用计时器定期检查网络回复

您需要使用
QCoreApplication::exec()
启动应用程序事件循环,然后调用QNAM方法,如
post

我想你可以在
exec
之前打电话给
post
,但你可能会遇到


另外,请注意,Qt 4.7 QNAM之前没有使用线程,而是使用了4.8。

我将在几天内无法测试这一点,但我会在周日之前告诉您它是否有效。我不太明白如果networkManager使用与声明中相同的方法,它将如何超出范围。您能解释一下吗?“您将能够从发送线程发送到它”据我所知,我的程序甚至没有使用线程。QNetworkAccessManager是否在某处创建了一个线程?QNAM的作用域仅在“发送”方法内-一旦该方法完成,该对象就消失了(除非您创建一个类变量/它的类实例。如果您将其创建为类变量并在ctor中创建一个实例,那么它将在“发送”运行后出现,并且能够响应/发送信号。请参阅指针超出范围,而不是对象。对象是传输实例的父对象,因此在这已被破坏。正确,指针超出范围。我的解释不正确,但解决方案仍然正确。先生们,我感谢你们两位。synthesizerpatel的链接也为+1。你们是否正在运行Qt事件循环?这很有意义。就像我告诉SynthezerPatel的,我要到星期天才能测试这个。我应该假设吗告诉我QCoreApplication::exec()应该通过我的程序main而不是在传输类中运行?是的,通常
main
的最后一行只是
return app.exec()
。到目前为止,还没有出现错误,但我可以确认这篇文章是有效的!非常感谢游吟诗人。如果我能多次投票给你的答案,我会:)这回答了我的问题,但有点不同。我试图在我的main()中实例化的类构造函数中启动一个QTimer在事件循环开始之前。这也解决了我的问题,有QTest,一个单独的main(通过qExec执行多个测试)和那些有计时器的测试。我添加了“QCoreApplication app(argc,argv)”,现在测试工作了,没有抛出错误。
#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;

}