#include "ZmqSocket.h"
#include "zmq.h"
#include <QDebug>
#include "tracehandle.h"
#include "appconfig.h"
ZmqSocket * ZmqSocket::m_instance = nullptr;
CommandHandle * CommandHandle::m_instance = nullptr;
void CommandHandle::createCommand()
{
ZmqSocket::createCommand();
if (nullptr == CommandHandle::m_instance)
{
CommandHandle::m_instance = new CommandHandle();
connect(ZmqSocket::getInstance(), SIGNAL(msgRep(QByteArray)), CommandHandle::m_instance, SIGNAL(msgRep(QByteArray)), Qt::UniqueConnection);
}
}
void CommandHandle::testSlot(QByteArray msg)
{
qDebug() << "CommandHandle testSlot" << msg;
//emit msgRep(msg);
}
void CommandHandle::destroyCommand()
{
static int index = 0;
while (index < 1000)
{
++index;
if (CommandHandle::m_instance->readMsg().isEmpty())
{
break;
}
QThread::msleep(1);
}
ZmqSocket::destroyCommand();
if (nullptr != CommandHandle::m_instance)
{
delete CommandHandle::m_instance;
CommandHandle::m_instance = nullptr;
}
}
void CommandHandle::sendMsg(QByteArray msg)
{
if (nullptr != CommandHandle::m_instance)
{
CommandHandle::m_instance->appendMsg(msg);
}
}
QByteArray CommandHandle::getMsg()
{
QByteArray msg;
if (nullptr != CommandHandle::m_instance)
{
msg = CommandHandle::m_instance->readMsg();
}
return msg;
}
CommandHandle::~CommandHandle()
{
}
CommandHandle::CommandHandle(QObject * parent)
: QObject(parent)
{
QThread *thread = new QThread;
this->moveToThread(thread);
thread->start();
}
void CommandHandle::start()
{
}
void CommandHandle::appendMsg(QByteArray msg)
{
mutex.lock();
if (!m_msgList.contains(msg))
{
m_msgList << msg;
}
mutex.unlock();
}
QByteArray CommandHandle::readMsg()
{
QByteArray msg;
mutex.lock();
if (m_msgList.count() > 0)
{
msg = m_msgList.takeFirst();
}
mutex.unlock();
return msg;
}
void ZmqSocket::createCommand()
{
if (nullptr == ZmqSocket::m_instance)
{
ZmqSocket::m_instance = new ZmqSocket();
ZmqSocket::m_instance->start();
}
}
void ZmqSocket::destroyCommand()
{
if (nullptr != ZmqSocket::m_instance)
{
ZmqSocket::m_instance->stopThread();
delete ZmqSocket::m_instance;
ZmqSocket::m_instance = nullptr;
}
}
ZmqSocket::~ZmqSocket()
{
if (nullptr != m_socket)
{
zmq_close(m_socket);
m_socket = nullptr;
}
if (nullptr != m_ctx)
{
zmq_ctx_term(m_ctx);
m_ctx = nullptr;
}
}
bool ZmqSocket::connect()
{
bool result = true;
// Set the receive timeout for ZMQ to 5 seconds
int iRcvTimeout = 500;
int iSedTimeout = 10;
if (m_socket == nullptr)
{
m_ctx = zmq_ctx_new();
if (nullptr == m_ctx)
{
result = false;
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_ctx_new failed."));
}
if (result)
{
m_socket = zmq_socket(m_ctx, ZMQ_REQ);
if (nullptr == m_socket)
{
zmq_ctx_destroy(m_ctx);
m_ctx = nullptr;
result = false;
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_socket failed."));
}
}
// if (result)
// {
// if (zmq_setsockopt(m_socket, ZMQ_SNDTIMEO, &iSedTimeout, sizeof(iSedTimeout)) < 0)
// {
// zmq_close(m_socket);
// zmq_ctx_destroy(m_ctx);
// m_socket = nullptr;
// m_ctx = nullptr;
// result = false;
// TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_setsockopt failed."));
// }
// }
// if (result)
// {
// if (zmq_setsockopt(m_socket, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0)
// {
// zmq_close(m_socket);
// zmq_ctx_destroy(m_ctx);
// m_socket = nullptr;
// m_ctx = nullptr;
// result = false;
// TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_setsockopt failed."));
// }
// }
if (result)
{
//if (zmq_connect(m_socket, "tcp://10.42.0.1:6666") < 0)
//if (zmq_connect(m_socket, "tcp://192.168.68.5:6666") < 0)
if (zmq_connect(m_socket, m_ip) < 0)
{
zmq_close(m_socket);
zmq_ctx_destroy(m_ctx);
m_socket = nullptr;
m_ctx = nullptr;
result = false;
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_connect %1 failed.").arg(m_ip));
}
}
}
return result;
}
void ZmqSocket::stopThread()
{
m_stop = true;
if (isRunning())
{
terminate();
}
mutex.tryLock(1000);
mutex.unlock();
}
ZmqSocket::ZmqSocket(QObject * parent)
: QThread(parent)
{
m_stop = false;
m_socket = nullptr;
m_ctx = nullptr;
memset(m_ip, 0x00, 32);
strncpy(m_ip, appConfig_getSendAddr().data(), 32 - 1);
qDebug()<<"cmd m_ip"<<QString(m_ip);
}
void ZmqSocket::writeMsgToSocket()
{
mutex.lock();
QByteArray msg = CommandHandle::getMsg();
if (!msg.isEmpty())
{
if (connect())
{
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("Write: %1").arg(QString(msg)));
if (zmq_send(m_socket,msg.data(), msg.size(), 0) > 0)
{
readMsgFromSocket();
}
else
{
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("zmq_send failed."));
}
}
else
{
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("connect failed."));
}
//if (connect() && (zmq_send(m_socket,msg.data(), msg.size(), 0) > 0))
//{
// readMsgFromSocket();
//}
}
mutex.unlock();
}
void ZmqSocket::readMsgFromSocket()
{
//if (!connect())
//{
// return;
//}
//原始人处理方式
// char szMsg[4096] = {0};
// int ret = zmq_recv(socket,szMsg,4096,0);
// if(ret <= 0) return QByteArray();
// QByteArray array;
// array.append(szMsg,ret);
//古代人处理方式
QByteArray ret;
zmq_msg_t message;
zmq_msg_init (&message);
int length = zmq_msg_recv (&message,m_socket, 0);
if (length > 0)
{
//发送消息 emit ***
ret.append(reinterpret_cast<char *>(zmq_msg_data (&message)), length);
TraceHandle::log_trace(__FILE__, __FUNCTION__, __LINE__, QString("Read: %1").arg(QString(ret)));
emit msgRep(ret);
// qDebug()<<"CMD Ret :"<<ret;
}
zmq_msg_close(&message);
//现代人处理方式
// QByteArray ret;
// while (true) {
// zmq_msg_t message;
// zmq_msg_init (&message);
// int len = zmq_msg_recv (&message,socket, 0);
// if(len <= 0) return QByteArray(); //wushuju huozhe cuowu
// // 处理一帧消息
// ret.append(reinterpret_cast<char *>(zmq_msg_data (&message)) ,len);
// zmq_msg_close (&message);
// int64_t more = 0;
// size_t more_size = sizeof (more);
// zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size);
// if (!more)
// break; // 已到达最后一帧
// }
}
void ZmqSocket::run()
{
while(!m_stop){
//写消息
writeMsgToSocket();
//读消息
//readMsgFromSocket();
QThread::msleep(10);
}
if (nullptr != m_socket)
{
zmq_close(m_socket);
m_socket = nullptr;
}
if (nullptr != m_ctx)
{
zmq_ctx_term(m_ctx);
m_ctx = nullptr;
}
}
帮我优化ZMQ请求应答超时后,主线程UI卡顿的问题
最新发布