void CTraderApi::Disconnect() { // 如果队列中有请求包,在后面又进行了Release,又回过头来发送,可能导致当了 StopThread(); m_status = E_unconnected; if(m_pApi) { m_pApi->RegisterSpi(NULL); m_pApi->Release(); m_pApi = NULL; if(m_msgQueue) m_msgQueue->Input_OnDisconnect(this,NULL,m_status); } m_lRequestID = 0;//由于线程已经停止,没有必要用原子操作了 ReleaseRequestListBuf(); ReleaseRequestMapBuf(); }
void CTraderApi::OnRspQryUserInvestor(CUstpFtdcRspUserInvestorField *pRspUserInvestor, CUstpFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { RspUserLoginField field = { 0 }; if (!IsErrorRspInfo(pRspInfo) && pRspUserInvestor) { memcpy(&m_RspUserInvestor, pRspUserInvestor, sizeof(CUstpFtdcRspUserInvestorField)); XRespone(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Done, 0, nullptr, 0, nullptr, 0, nullptr, 0); } else { field.ErrorID = pRspInfo->ErrorID; strncpy(field.ErrorMsg, pRspInfo->ErrorMsg, sizeof(pRspInfo->ErrorMsg)); XRespone(ResponeType::OnConnectionStatus, m_msgQueue, this, ConnectionStatus::Disconnected, 0, &field, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0); } if (bIsLast) ReleaseRequestMapBuf(nRequestID); }
void CTraderApi::OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { if (!IsErrorRspInfo(pRspInfo) &&pRspUserLogin) { m_status = E_logined; if(m_msgQueue) m_msgQueue->Input_OnConnect(this,pRspUserLogin,m_status); memcpy(&m_RspUserLogin,pRspUserLogin,sizeof(CThostFtdcRspUserLoginField)); m_nMaxOrderRef = atol(pRspUserLogin->MaxOrderRef); ReqSettlementInfoConfirm(); } else { m_status = E_authed; if(m_msgQueue) m_msgQueue->Input_OnDisconnect(this,pRspInfo,E_logining); } if (bIsLast) ReleaseRequestMapBuf(nRequestID); }