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;
}