Commit 191a20ff by 李定达

1.调整网络异常的提示时间;2.调整线程的安全的退出;3.重构工作流模块

parent 3ad9f0de
......@@ -6,6 +6,8 @@
#include "event/posevent.h"
#include "model/posorderpool.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QEventLoop>
......@@ -14,11 +16,12 @@
#include "QsLog.h"
OrderGetWork::OrderGetWork(QObject *parent) : QObject(parent)
OrderGetWork::OrderGetWork(WorkObject *parent) : WorkObject(parent)
{
_timeout = VALUE_PULLSYNCTIME;
_stopflag = false;
_islogin = false;
_stoped = false;
_timestamp = "0";
connect(&_timer, &QTimer::timeout, [this] () {
......@@ -50,19 +53,30 @@ OrderGetWork::OrderGetWork(QObject *parent) : QObject(parent)
_timer.start((TIMEOUT_TOKEN_LOGIN));
}
void OrderGetWork::workStart()
OrderGetWork::~OrderGetWork()
{
while(!_stoped)
{
_stopflag = true;
emit quit();
EVENTWAIT(10);
}
}
void OrderGetWork::workstart()
{
QLOG_INFO() << "OrderGetWork::workStart : " << QThread::currentThreadId();
while(!_stopflag)
{
unsigned int tmptime = _timeout;
unsigned int nexttime = _timeout;
QString error;
do
{
if(_islogin && !PullOrder(nexttime, error))
if(!_stopflag && _islogin && !PullOrder(nexttime, error))
{
QLOG_ERROR() << QThread::currentThreadId() << "PullOrder failed";
tmptime = _timeout;
......@@ -79,14 +93,18 @@ void OrderGetWork::workStart()
}while(0);
QEventLoop loop;
if(_stopflag)
break;
QTimer::singleShot(tmptime, &loop, &QEventLoop::quit);
QEventLoop loop;
QTimer::singleShot(tmptime*1000, &loop, &QEventLoop::quit);
connect(this, &OrderGetWork::quit, &loop, &QEventLoop::quit);
loop.exec();
}
QLOG_INFO() << "OrderGetWork::workstart quit";
_stoped = true;
}
void OrderGetWork::SetStoreInfoToConfig()
......@@ -156,7 +174,7 @@ bool OrderGetWork::loginToServer(QString &error)
QLOG_INFO() << "login request url :" << realurl;
if(!BillSocket::S_Request(json, recvjson, realurl, error))
if(!this->S_Request(json, recvjson, realurl, error))
{
error = QString::fromLocal8Bit("登录失败,网络错误:").append(error);
QLOG_ERROR() << "login failed";
......@@ -192,9 +210,6 @@ bool OrderGetWork::loginToServer(QString &error)
bool OrderGetWork::bingToServer(QString &error)
{
// if(OrderGetDataProcess::isBind())
// return true;
error.clear();
QJsonObject json, recvjson;
......@@ -218,7 +233,7 @@ bool OrderGetWork::bingToServer(QString &error)
QLOG_INFO() << "login request url :" << realurl;
if(!BillSocket::S_Request(json, recvjson, realurl, error))
if(!this->S_Request(json, recvjson, realurl, error))
{
error = QString::fromLocal8Bit("绑定失败,网络错误:").append(error);
QLOG_ERROR() << "login failed";
......@@ -276,11 +291,9 @@ bool OrderGetWork::PullOrder(unsigned int timeout, QString &error)
QLOG_INFO() << "pullorder request url :" << realurl;
if(!BillSocket::S_Request(json, recvjson, realurl, error))
if(!this->S_Request(json, recvjson, realurl, error))
{
error = QString::fromLocal8Bit("拉单失败,网络错误:").append(error);
//QVariantMap value;
//POSTEVENTTYPE(PosEvent::s_network_outtime,value,QVariantMap);
QLOG_ERROR() << "pullorder failed : " << error;
return false;
}
......@@ -308,6 +321,49 @@ bool OrderGetWork::PullOrder(unsigned int timeout, QString &error)
return true;
}
bool OrderGetWork::S_Request(const QJsonObject &requestJson, QJsonObject &recvJson, QString url, QString &error, QByteArray contentype)
{
QNetworkAccessManager m_networkManger;
if(QNetworkAccessManager::Accessible != m_networkManger.networkAccessible())
{
m_networkManger.setNetworkAccessible(QNetworkAccessManager::Accessible);
}
QNetworkRequest networkRequest;
networkRequest.setUrl(url);
networkRequest.setRawHeader("Content-Type",contentype);
QByteArray sendArray = QJsonDocument(requestJson).toJson(QJsonDocument::Compact);
QEventLoop eventLoop;
QNetworkReply *reply = m_networkManger.post(networkRequest , sendArray);
connect(&m_networkManger, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), &eventLoop, SLOT(quit()));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &eventLoop, SLOT(quit()));
connect(this, &OrderGetWork::quit, &eventLoop,&QEventLoop::quit);
// 加用定时器防止网络出现异常长时间不返回导致的阻塞
QTimer::singleShot(JSON_LOGIN_TIMEOUT, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
if(reply->error() != QNetworkReply::NoError)
{
error = reply->errorString();
return false;
}
QByteArray recvArray = reply->readAll();
if(recvArray.size() == 0)
{
error = "nothing recved";
return false;
}
recvJson = QJsonDocument::fromJson(recvArray).object();
qDebug() << recvJson;
reply->deleteLater();
return true;
}
void OrderGetWork::setTimeout(unsigned int timeout)
{
_timeout = timeout;
......@@ -366,7 +422,7 @@ void OrderGetWork::optOrderWithType(const QVariantMap &map)
QLOG_INFO() << "optOrderWithType request url :" << realurl;
if(!BillSocket::S_Request(json, recvjson, realurl, error))
if(!this->S_Request(json, recvjson, realurl, error))
{
QVariantMap tmpmap;
......@@ -527,12 +583,6 @@ unsigned int OrderGetWork::timeout() const
return _timeout;
}
void OrderGetWork::setStopflag(bool stopflag)
{
_stopflag = stopflag;
emit quit();
}
bool OrderGetWork::event(QEvent *e)
{
......
......@@ -11,11 +11,12 @@
#include <QApplication>
#include <QSettings>
#include "base/Network/billSocket.h"
//#include "base/Network/billSocket.h"
#include "preDefine.h"
#include "base/Arithmetic/cretopt.h"
#include "workobject.h"
#define FMH_BIND 0
#define FMH_LOGIN 1
......@@ -42,20 +43,18 @@
#define FMH_MAX 256
//拉订单工作了流 送出 退单 接单 等 非阻塞可以和其他对象共享线程 不允许阻塞操作在该对象中
class OrderGetWork : public QObject
class OrderGetWork : public WorkObject
{
Q_OBJECT
public:
explicit OrderGetWork(QObject *parent = 0);
explicit OrderGetWork(WorkObject *parent = 0);
void workStart();
~OrderGetWork();
unsigned int timeout() const;
void setTimeout(unsigned int timeout);
void setStopflag(bool stopflag);
bool loginToServer(QString &error);
bool bingToServer(QString &error);
......@@ -70,8 +69,12 @@ public:
void loginStart();
signals:
void quit();
bool S_Request(const QJsonObject &requestJson, QJsonObject &recvJson, QString url, QString &error, QByteArray contentype = QByteArray("text/json"));
public slots:
void workstart();
//signals:
// void quit();
private:
//设置门店信息
......@@ -96,7 +99,7 @@ private:
//服务器地址
QString _url;
//停止标识
bool _stopflag;
//bool _stopflag;
//是否登录成功
bool _islogin;
//拉单时间戳
......@@ -107,6 +110,8 @@ private:
QString _autoconfirm;
//自动重新登录
QTimer _timer;
//是否停止
//bool _stoped;
};
class OrderGetDataProcess
......
......@@ -10,7 +10,7 @@
#include <QSqlQuery>
#include <QStringList>
OrderLocalizeWork::OrderLocalizeWork(QObject *parent) : QObject(parent)
OrderLocalizeWork::OrderLocalizeWork(WorkObject *parent) : WorkObject(parent)
{
//订单状态改变更新db
FMApplication::subscibeEvent(this, PosEvent::s_change_order);
......
......@@ -2,12 +2,13 @@
#define ORDERLOCALIZEWORK_H
#include <QObject>
#include "workobject.h"
class OrderLocalizeWork : public QObject
class OrderLocalizeWork : public WorkObject
{
Q_OBJECT
public:
explicit OrderLocalizeWork(QObject *parent = 0);
explicit OrderLocalizeWork(WorkObject *parent = 0);
virtual bool event(QEvent *e);
......
......@@ -17,7 +17,7 @@
#include <QSettings>
orderprintwork::orderprintwork(QObject *parent) : QObject(parent)
orderprintwork::orderprintwork(WorkObject *parent) : WorkObject(parent)
{
//订阅订单本地化事件
FMApplication::subscibeEvent(this, PosEvent::s_order_location);
......
......@@ -2,12 +2,13 @@
#define ORDERPRINTWORK_H
#include <QObject>
#include "workobject.h"
class orderprintwork : public QObject
class orderprintwork : public WorkObject
{
Q_OBJECT
public:
explicit orderprintwork(QObject *parent = 0);
explicit orderprintwork(WorkObject *parent = 0);
virtual bool event(QEvent *e);
......
......@@ -14,16 +14,16 @@
#include "QsLog.h"
OrderPushWork::OrderPushWork(QObject *parent) : QObject(parent)
OrderPushWork::OrderPushWork(WorkObject *parent) : WorkObject(parent)
{
_socket = NULL;
_stopflag = 1;
//_stopflag = 1;
_needlogin = 1;
_server_index = -1;
_token = QString("");
_serurl.clear();
_istimeout = true;
_networkstatic_index=1;
_networkstatic_index = 0;
FMApplication::subscibeEvent(this, PosEvent::s_token_change);
FMApplication::subscibeEvent(this, PosEvent::s_login_storeinfo);
......@@ -31,12 +31,12 @@ OrderPushWork::OrderPushWork(QObject *parent) : QObject(parent)
OrderPushWork::~OrderPushWork()
{
if(_socket != NULL)
qDebug() << "";
while(!_stoped)
{
if(_socket->isOpen())
_socket->close();
delete _socket;
_socket = NULL;
_stopflag = true;
emit quit();
EVENTWAIT(10);
}
}
......@@ -55,13 +55,6 @@ void OrderPushWork::setServer_index(int server_index)
_server_index = server_index;
}
void OrderPushWork::setStopflag()
{
if(_socket!= NULL && _socket->isOpen())
_socket->close();
_stopflag = 0;
}
bool OrderPushWork::event(QEvent *e)
{
if(e->type() == PosEvent::s_token_change)
......@@ -78,6 +71,7 @@ bool OrderPushWork::event(QEvent *e)
_needlogin = 1;
emit quit();
return true;
}
......@@ -164,6 +158,25 @@ bool OrderPushWork::connectTcpServer()
return !_istimeout;
}
void OrderPushWork::networkouttime(bool networkstatus)
{
if(networkstatus)
{
_networkstatic_index=0;
QVariantMap map;
map.insert(EVENT_KEY_NETWORKSTATUS, networkstatus);
POSTEVENTTYPE(PosEvent::s_network_outtime,map,QVariantMap);
}else if(!networkstatus && _networkstatic_index == 0){
_networkstatic_index++;
QVariantMap map;
map.insert(EVENT_KEY_NETWORKSTATUS, networkstatus);
POSTEVENTTYPE(PosEvent::s_network_outtime,map,QVariantMap);
QLOG_INFO() << "static: s_network_outtime ...";
}
}
bool OrderPushWork::loginTcpServer()
{
QByteArray requestdata;
......@@ -252,28 +265,9 @@ bool OrderPushWork::loginTcpServer()
return false;
}
void OrderPushWork::networkouttime(bool networkstatus)
{
if(networkstatus)
{
_networkstatic_index=0;
QVariantMap map;
map.insert(EVENT_KEY_NETWORKSTATUS, networkstatus);
POSTEVENTTYPE(PosEvent::s_network_outtime,map,QVariantMap);
}else if(!networkstatus && _networkstatic_index == 0){
_networkstatic_index++;
QVariantMap map;
map.insert(EVENT_KEY_NETWORKSTATUS, networkstatus);
POSTEVENTTYPE(PosEvent::s_network_outtime,map,QVariantMap);
QLOG_INFO() << "static: s_network_outtime ...";
}
}
void OrderPushWork::heartBeatTcpService()
{
while(_stopflag && !_needlogin)
while(!_stopflag && !_needlogin)
{
QLOG_INFO() << "wait recv json ...";
......@@ -287,7 +281,7 @@ void OrderPushWork::heartBeatTcpService()
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(this, &OrderPushWork::readready, &loop, &QEventLoop::quit);
timer.start(4*60*1000);
timer.start(75*1000);
loop.exec();
}
......@@ -484,7 +478,7 @@ bool OrderPushWork::getHost(QString &ip, qint16 &port)
return false;
}
void OrderPushWork::workStart()
void OrderPushWork::workstart()
{
QLOG_INFO() << "OrderPushWork::workStart start : " << QThread::currentThreadId();
......@@ -504,26 +498,30 @@ void OrderPushWork::workStart()
QLOG_INFO() << "get token success : " << _token;
while(!GetServiceList() && _stopflag)
while(!_stopflag && !GetServiceList())
{
QLOG_WARN() << "GetServiceList failed timeout 10 sec";
EVENTWAIT(10000);
QEventLoop loop;
connect(this, &OrderPushWork::quit, &loop,&QEventLoop::quit);
QTimer::singleShot(10000, &loop, SLOT(quit()));
loop.exec();
}
QLOG_INFO() << "GetServiceList success : " << _servicelist;
QLOG_INFO() << "GetServiceList success : " << _servicelist << _stopflag;
while(_stopflag)
while(!_stopflag)
{
do
{
if(!connectTcpServer())
{
//QVariantMap value;
//POSTEVENTTYPE(PosEvent::s_network_outtime,value,QVariantMap);
networkouttime(false);
QLOG_ERROR() << "connectTcpServer failed";
break;
}else{
}
else
{
networkouttime(true);
}
......@@ -536,16 +534,19 @@ void OrderPushWork::workStart()
_needlogin = 0;
heartBeatTcpService();
networkouttime(false);
}while(0);
//网络异常断开重连
CLOSESOCKES(_socket);
delete _socket;
_socket = NULL;
if(_stopflag)
break;
EVENTWAIT(60000);
}
_stoped = true;
}
void OrderPushWork::setSerurl(const QString &serurl)
......
......@@ -13,16 +13,13 @@
#include <QDebug>
#include <WinSock.h>
#include "preDefine.h"
#define EVENTWAIT(timer) do{ \
QEventLoop loop; \
QTimer::singleShot(timer, &loop, SLOT(quit())); \
loop.exec(); \
} while(0)
#include "workobject.h"
#define CLOSESOCKES(socket) do{ \
if(socket != NULL && socket->isOpen()){ \
socket->close(); \
delete socket; \
socket = NULL; \
} \
} while(0)
......@@ -107,11 +104,11 @@ typedef struct
// 推单工作流 推送 s_need_get_order 事件 阻塞模式必须拥有单独线程
class OrderPushWork : public QObject
class OrderPushWork : public WorkObject
{
Q_OBJECT
public:
explicit OrderPushWork(QObject *parent = 0);
explicit OrderPushWork(WorkObject *parent = 0);
~OrderPushWork();
......@@ -123,14 +120,13 @@ public:
void setServer_index(int server_index);
void setStopflag();
virtual bool event(QEvent *e);
void setToken(const QString &token);
void setSerurl(const QString &serurl);
void networkouttime(bool networkstatus);
private:
//链接到服务器
bool connectTcpServer();
......@@ -145,13 +141,13 @@ public:
private:
bool GetServiceList();
void networkouttime(bool networkstatus);
public slots:
//推模式入口
void workStart();
void workstart();
signals:
void quit();
// void quit();
void connected();
......@@ -167,7 +163,7 @@ private:
//当前使用服务器列表下标
int _server_index;
//停止标志位置
qint8 _stopflag;
//qint8 _stopflag;
//重新登录标识
qint8 _needlogin;
//超时标识
......@@ -181,7 +177,7 @@ private:
QMutex _token_lock;
//获取服务器列表地址
QString _serurl;
//网络失败提示的个数
//
int _networkstatic_index;
};
......
#include "workcontrol.h"
WorkControl::WorkControl(QObject *parent) : QObject(parent)
{
}
#ifndef WORKCONTROL_H
#define WORKCONTROL_H
#include <QObject>
//根据配置实例化工作流为实现;
class WorkControl : public QObject
{
Q_OBJECT
public:
explicit WorkControl(QObject *parent = 0);
signals:
public slots:
};
#endif // WORKCONTROL_H
#include "workobject.h"
#include <QThread>
WorkObject::WorkObject(QObject *parent) : QObject(parent)
{
_stopflag = false;
_stoped = false;
}
WorkObject::~WorkObject()
{
emit workclose();
if(this->thread() != QThread::currentThread())
{
this->thread()->wait(20);
}
}
void WorkObject::moveToThread(QThread *thread, bool with_thread_start)
{
if(with_thread_start)
{
connect(thread, &QThread::started, this, &WorkObject::workstart);
connect(this, &WorkObject::workclose, thread, &QThread::quit);
}
QObject::moveToThread(thread);
}
void WorkObject::workstart()
{
_stoped = true;
}
#ifndef WORKOBJECT_H
#define WORKOBJECT_H
#include <QObject>
#include <QEventLoop>
#include <QTimer>
#define EVENTWAIT(timer) do{ \
QEventLoop loop; \
QTimer::singleShot(timer, &loop, SLOT(quit())); \
loop.exec(); \
} while(0)
class WorkObject : public QObject
{
Q_OBJECT
public:
explicit WorkObject(QObject *parent = 0);
~WorkObject();
void moveToThread(QThread *thread, bool with_thread_start);
signals:
void workclose();
void quit();
public slots:
virtual void workstart();
protected:
bool _stopflag;
bool _stoped;
};
#endif // WORKOBJECT_H
......@@ -6,6 +6,7 @@
QMap< int, QSet<QObject *> > FMApplication::s_user_event_pool;
QMutex FMApplication::s_mutex;
bool FMApplication::s_stop_flag = false;
FMApplication::FMApplication(int &argc, char **argv):QApplication(argc, argv)
{
......@@ -21,7 +22,7 @@ void FMApplication::postEvent(QObject *receiver, QEvent *event, int priority)
int type = event->type();
//处理自定义事件
if(type >= QEvent::User && type <= QEvent::MaxUser)
if((!s_stop_flag) && type >= QEvent::User && type <= QEvent::MaxUser)
{
QMutexLocker loker(&s_mutex);
......@@ -97,4 +98,10 @@ void FMApplication::logoutEvent(QObject *listener, QEvent::Type type)
}
void FMApplication::exit(int rlt)
{
s_stop_flag = true;
qApp->exit(rlt);
}
......@@ -21,11 +21,17 @@ public:
//取消订阅事件
static void logoutEvent(QObject *listener, QEvent::Type type);
//程序退出
static void exit(int rlt = 0);
private:
//自定义事件池,key事件类型;value订阅该类型事件指针的集合
static QMap< int, QSet<QObject *> > s_user_event_pool;
//自定义事件池操作事件锁
static QMutex s_mutex;
//停止事件推送
static bool s_stop_flag;
};
#endif // FMCOREAPPLICATION_H
......@@ -124,6 +124,7 @@ int main(int argc, char *argv[])
LoadTheme(QString("deaufult"));
QLOG_INFO() << "--------------------------------takeout start------------------------------------";
//线程必须定义
QThread thread;
QThread threadt;
QThread prtthreadt;
......@@ -147,13 +148,10 @@ int main(int argc, char *argv[])
work.setTimeout(180000);
pwork.setSerurl(pushurl);
//移动子工作流到线程
loac.moveToThread(&thread);
work.moveToThread(&thread);
printwork.moveToThread(&prtthreadt);
pwork.moveToThread(&threadt);
//关联主动启动工作流和线程同时启动
QObject::connect(&thread, &QThread::started, &work, &OrderGetWork::workStart);
QObject::connect(&threadt, &QThread::started, &pwork, &OrderPushWork::workStart);
loac.moveToThread(&thread, false);
work.moveToThread(&thread, true);
printwork.moveToThread(&prtthreadt, true);
pwork.moveToThread(&threadt, true);
//启动tcp长链接和拉单工作流
thread.start();
threadt.start();
......@@ -162,7 +160,6 @@ int main(int argc, char *argv[])
MainForm mainform;
LoginForm loginform;
FloatForm floatform;
//开始展示界面
mainform.MyShow();
loginform.showfull();
......
......@@ -59,8 +59,8 @@ SOURCES += main.cpp \
control/orderprintwork.cpp \
view/loginform.cpp \
model/discountObject.cpp \
control/workcontrol.cpp \
view/prtsettingform.cpp
view/prtsettingform.cpp \
control/workobject.cpp
HEADERS += \
event/fmapplication.h \
......@@ -96,9 +96,9 @@ HEADERS += \
control/orderprintwork.h \
view/loginform.h \
model/discountObject.h \
control/workcontrol.h \
view/prtsettingform.h \
base/System/GetPrinters.h
base/System/GetPrinters.h \
control/workobject.h
DISTFILES += takeout.rc
......
......@@ -198,7 +198,7 @@ bool MainForm::event(QEvent *e)
onSetNetStatus(QString::fromLocal8Bit("网络正常"));
}else{
QLOG_INFO() << "STATIC: EVENT_KEY_NETWORKSTATUS:false";
onSetNetStatus(QString::fromLocal8Bit("网络异常"));
onSetNetStatus(QString("<font color='#ff0000'>%1</font>").arg(QString::fromLocal8Bit("网络异常")));
onShowAlert(AlertForm::ERROR, QString::fromLocal8Bit("网络异常,请检查网络链接!"));
}
return true;
......
#include "SysTray.h"
#include <QApplication>
#include <QThread>
#include "event/fmapplication.h"
extern QThread workThread;
......@@ -27,5 +28,7 @@ void SysTray::onActionQuitTriggered()
{
//workThread.terminate();
qApp->exit(-1);
FMApplication::exit();
//qApp->exit(-1);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment