Commit 191a20ff by 李定达

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

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