Commit 59e0488a by Carwyn

Fixes: 监听 Socket 状态时,主动关闭会导致卡死问题;

parent 3eb917df
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <QApplication> #include <QApplication>
#include <QMessageBox> #include <QMessageBox>
#include <QMenu> #include <QMenu>
#include <QTimer>
#include <winsock2.h>
FMVipDispatcher::FMVipDispatcher(QObject *parent) FMVipDispatcher::FMVipDispatcher(QObject *parent)
: QObject(parent), : QObject(parent),
...@@ -17,14 +19,17 @@ FMVipDispatcher::FMVipDispatcher(QObject *parent) ...@@ -17,14 +19,17 @@ FMVipDispatcher::FMVipDispatcher(QObject *parent)
_vindow(0), _vindow(0),
isLastOne(true), isLastOne(true),
_windowReturn(0), _windowReturn(0),
_posSocket(new QTcpSocket(this)), _posSocketTimer(new QTimer(this)),
_sysIcon(new QSystemTrayIcon) _sysIcon(new QSystemTrayIcon)
{ {
connect(this, SIGNAL(requested(QJsonObject)), SLOT(onRequest(QJsonObject))); connect(this, SIGNAL(requested(QJsonObject)), SLOT(onRequest(QJsonObject)));
connect(this, SIGNAL(responded(QByteArray)), SLOT(onResponse(QByteArray))); connect(this, SIGNAL(responded(QByteArray)), SLOT(onResponse(QByteArray)));
connect(FMVipForward::instance(), SIGNAL(serverResponsed(QJsonObject)), SLOT(onServerResponsed(QJsonObject))); connect(FMVipForward::instance(), SIGNAL(serverResponsed(QJsonObject)), SLOT(onServerResponsed(QJsonObject)));
connect(this, SIGNAL(initSocket()),this, SLOT(onInitSocket())); _posSocketTimer->setInterval(5000);
connect(_posSocketTimer, SIGNAL(timeout()), SLOT(onCheckSocket()));
connect(this, SIGNAL(stopSocketTimer()), _posSocketTimer, SLOT(stop()));
connect(this, SIGNAL(startSocketTimer()), _posSocketTimer, SLOT(start()));
QIcon icon = QIcon(":/img_logo.png"); QIcon icon = QIcon(":/img_logo.png");
_sysIcon->setIcon(icon); _sysIcon->setIcon(icon);
...@@ -50,9 +55,9 @@ FMVipDispatcher::~FMVipDispatcher() ...@@ -50,9 +55,9 @@ FMVipDispatcher::~FMVipDispatcher()
_sysIcon = NULL; _sysIcon = NULL;
} }
if(_posSocket != nullptr) { if(_posSocketTimer != nullptr) {
delete _posSocket; delete _posSocketTimer;
_posSocket = nullptr; _posSocketTimer = nullptr;
} }
} }
...@@ -91,16 +96,13 @@ INT FMVipDispatcher::_ParseRequest(LPSTR data) ...@@ -91,16 +96,13 @@ INT FMVipDispatcher::_ParseRequest(LPSTR data)
// 唤起客户端界面 // 唤起客户端界面
emit requested(_posReqObj); emit requested(_posReqObj);
return FM_API_SUCCESS; return FM_API_SUCCESS;
} }
BOOL FMVipDispatcher::_GetResponse(LPSTR &rsp, UINT &len) BOOL FMVipDispatcher::_GetResponse(LPSTR &rsp, UINT &len)
{ {
emit startSocketTimer();
mutex.lock(); mutex.lock();
emit initSocket();
if(_serverRspData.isEmpty()) if(_serverRspData.isEmpty())
{ {
// 服务器还未返回则一直阻塞 // 服务器还未返回则一直阻塞
...@@ -112,6 +114,8 @@ BOOL FMVipDispatcher::_GetResponse(LPSTR &rsp, UINT &len) ...@@ -112,6 +114,8 @@ BOOL FMVipDispatcher::_GetResponse(LPSTR &rsp, UINT &len)
qDebug() << "发给POS:" << rsp; qDebug() << "发给POS:" << rsp;
emit stopSocketTimer();
return 1; return 1;
} }
...@@ -334,10 +338,31 @@ BOOL FMVipDispatcher::isLogined() ...@@ -334,10 +338,31 @@ BOOL FMVipDispatcher::isLogined()
return account != ""; return account != "";
} }
void FMVipDispatcher::onInitSocket() void FMVipDispatcher::onCheckSocket()
{ {
_posSocket->setSocketDescriptor(_socket); if(_socket <=0 ) {
connect(_posSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onDisconnected()), Qt::UniqueConnection); emit stopSocketTimer();
return;
}
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData);
HANDLE closeEvent = WSACreateEvent();
WSAEventSelect(_socket, closeEvent, FD_CLOSE);
DWORD dwRet = WaitForSingleObject(closeEvent, 0);
if(dwRet == WSA_WAIT_EVENT_0) {
onDisconnected();
}
WSACloseEvent(closeEvent);
WSACleanup();
} }
void FMVipDispatcher::onDisconnected() void FMVipDispatcher::onDisconnected()
......
...@@ -41,8 +41,8 @@ protected: ...@@ -41,8 +41,8 @@ protected:
signals: signals:
void requested(const QJsonObject &); void requested(const QJsonObject &);
void responded(const QByteArray &); void responded(const QByteArray &);
void startSocketTimer();
void initSocket(); void stopSocketTimer();
private slots: private slots:
void onRequest(const QJsonObject &jsonObj); void onRequest(const QJsonObject &jsonObj);
...@@ -53,7 +53,7 @@ private slots: ...@@ -53,7 +53,7 @@ private slots:
void onDoPost(); void onDoPost();
void onInitSocket(); void onCheckSocket();
void onDisconnected(); void onDisconnected();
void onActiveSysTrayIcon(QSystemTrayIcon::ActivationReason); void onActiveSysTrayIcon(QSystemTrayIcon::ActivationReason);
...@@ -68,7 +68,7 @@ private: ...@@ -68,7 +68,7 @@ private:
QSystemTrayIcon *_sysIcon; QSystemTrayIcon *_sysIcon;
QTcpSocket *_posSocket; QTimer *_posSocketTimer;
QMutex mutex; QMutex mutex;
QWaitCondition serverIsBusy; QWaitCondition serverIsBusy;
......
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