Exemple #1
0
void CTraderApi::RunInThread()
{
	int iRet = 0;

	while (!m_reqList.empty()&&m_bRunning)
	{
		SRequest * pRequest = m_reqList.front();
		int lRequest = ++m_lRequestID;// 这个地方是否会出现原子操作的问题呢?
		switch(pRequest->type)
		{
		case E_ReqAuthenticateField:
			iRet = m_pApi->ReqAuthenticate(&pRequest->ReqAuthenticateField,lRequest);
			break;
		case E_ReqUserLoginField:
			iRet = m_pApi->ReqUserLogin(&pRequest->ReqUserLoginField,lRequest);
			break;
		case E_SettlementInfoConfirmField:
			iRet = m_pApi->ReqSettlementInfoConfirm(&pRequest->SettlementInfoConfirmField,lRequest);
			break;
		case E_QryInstrumentField:
			iRet = m_pApi->ReqQryInstrument(&pRequest->QryInstrumentField,lRequest);
			break;
		case E_QryTradingAccountField:
			iRet = m_pApi->ReqQryTradingAccount(&pRequest->QryTradingAccountField,lRequest);
			break;
		case E_QryInvestorPositionField:
			iRet = m_pApi->ReqQryInvestorPosition(&pRequest->QryInvestorPositionField,lRequest);
			break;
		case E_QryInvestorPositionDetailField:
			iRet=m_pApi->ReqQryInvestorPositionDetail(&pRequest->QryInvestorPositionDetailField,lRequest);
			break;
		case E_QryInstrumentCommissionRateField:
			iRet = m_pApi->ReqQryInstrumentCommissionRate(&pRequest->QryInstrumentCommissionRateField,lRequest);
			break;
		case E_QryInstrumentMarginRateField:
			iRet = m_pApi->ReqQryInstrumentMarginRate(&pRequest->QryInstrumentMarginRateField,lRequest);
			break;
		case E_QryDepthMarketDataField:
			iRet = m_pApi->ReqQryDepthMarketData(&pRequest->QryDepthMarketDataField,lRequest);
			break;
		default:
			_ASSERT(FALSE);
			break;
		}

		if (0 == iRet)
		{
			//返回成功,填加到已发送池
			m_nSleep = 1;
			AddRequestMapBuf(lRequest,pRequest);

			lock_guard<mutex> cl(m_csList);
			m_reqList.pop_front();
		}
		else
		{
			//失败,按4的幂进行延时,但不超过1s
			m_nSleep *= 4;
			m_nSleep %= 1023;
		}
		Sleep(m_nSleep);
	}

	//清理线程
	CloseHandle(m_hThread);
	m_hThread = NULL;
	m_bRunning = false;
}
void CTraderApi::RunInThread()
{
	int iRet = 0;

	while (!m_reqList.empty()&&m_bRunning)
	{
		SRequest * pRequest = m_reqList.front();
		int lRequest = ++m_lRequestID;// 这个地方是否会出现原子操作的问题呢?
		switch(pRequest->type)
		{
		case E_ReqUserLoginField:
			iRet = m_pApi->ReqUserLogin(&pRequest->ReqUserLoginField,lRequest);
			break;
		case E_QryUserInvestorField:
			iRet = m_pApi->ReqQryUserInvestor(&pRequest->QryUserInvestorField, lRequest);
			break;
		case E_QryInstrumentField:
			iRet = m_pApi->ReqQryInstrument(&pRequest->QryInstrumentField,lRequest);
			break;
		case E_QryInvestorAccountField:
			iRet = m_pApi->ReqQryInvestorAccount(&pRequest->QryInvestorAccountField, lRequest);
			break;
		case E_QryInvestorPositionField:
			iRet = m_pApi->ReqQryInvestorPosition(&pRequest->QryInvestorPositionField,lRequest);
			break;
		case E_QryInvestorFeeField:
			iRet = m_pApi->ReqQryInvestorFee(&pRequest->QryInvestorFeeField, lRequest);
			break;
		case E_QryInvestorMarginField:
			iRet = m_pApi->ReqQryInvestorMargin(&pRequest->QryInvestorMarginField, lRequest);
			break;
		case E_QryOrderField:
			iRet = m_pApi->ReqQryOrder(&pRequest->QryOrderField, lRequest);
			break;
		case E_QryTradeField:
			iRet = m_pApi->ReqQryTrade(&pRequest->QryTradeField, lRequest);
			break;
		default:
			assert(false);
			break;
		}

		if (0 == iRet)
		{
			//返回成功,填加到已发送池
			m_nSleep = 1;
			AddRequestMapBuf(lRequest,pRequest);

			lock_guard<mutex> cl(m_csList);
			m_reqList.pop_front();
		}
		else
		{
			//失败,按4的幂进行延时,但不超过1s
			m_nSleep *= 4;
			m_nSleep %= 1023;
		}
		this_thread::sleep_for(chrono::milliseconds(m_nSleep));
	}

	// 清理线程
	m_hThread = nullptr;
	m_bRunning = false;
}
Exemple #3
0
void CTraderApi::RunInThread()
{
	int iRet = 0;

	while (!m_reqList.empty()&&m_bRunning)
	{
		SRequest * pRequest = m_reqList.front();
		long lRequest = InterlockedIncrement(&m_lRequestID);
		switch(pRequest->type)
		{
		case E_AbiInstrumentField:
			{
				DFITCAbiInstrumentField* body = (DFITCAbiInstrumentField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryArbitrageInstrument(body);
			}
			break;
		case E_CapitalField:
			{
				DFITCCapitalField* body = (DFITCCapitalField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryCustomerCapital(body);
			}
			break;
		case E_ExchangeInstrumentField:
			{
				DFITCExchangeInstrumentField* body = (DFITCExchangeInstrumentField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryExchangeInstrument(body);
			}
			break;
		case E_Init:
			lRequest = 0;
			iRet = ReqInit();
			break;
		case E_InsertOrderField:
			_ASSERT(FALSE);
			break;
		case E_MatchField:
			{
				DFITCMatchField* body = (DFITCMatchField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryMatchInfo(body);
			}
			break;
		case E_OrderField:
			{
				DFITCOrderField* body = (DFITCOrderField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryOrderInfo(body);
			}
			break;
		case E_PositionField:
			{
				DFITCPositionField* body = (DFITCPositionField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryPosition(body);
			}
			break;
		case E_PositionDetailField:
			{
				DFITCPositionDetailField* body = (DFITCPositionDetailField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQryPositionDetail(body);
			}
			break;
		case E_SpecificInstrumentField:
			{
				DFITCSpecificInstrumentField* body = (DFITCSpecificInstrumentField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqQrySpecifyInstrument(body);
			}
			break;
		case E_UserLoginField:
			{
				DFITCUserLoginField* body = (DFITCUserLoginField*)pRequest->pBuf;
				body->lRequestID = lRequest;
				iRet = m_pApi->ReqUserLogin(body);
			}
			break;
		case E_QuoteSubscribeField:
			{
				DFITCQuoteSubscribeField * body = (DFITCQuoteSubscribeField*)pRequest->pBuf;
				//body->lRequestID = lRequest;
				iRet = m_pApi->ReqQuoteSubscribe(body);
			}
			break;
		default:
			_ASSERT(FALSE);
			break;
		}

		if (0 == iRet)
		{
			//返回成功,填加到已发送池
			m_nSleep = 1;
			AddRequestMapBuf(lRequest,pRequest);

			CLock cl(&m_csList);
			m_reqList.pop_front();
		}
		else
		{
			//失败,按4的幂进行延时,但不超过1s
			m_nSleep *= 4;
			m_nSleep %= 1023;
		}
		Sleep(m_nSleep);
	}

	//清理线程
	CloseHandle(m_hThread);
	m_hThread = NULL;
	m_bRunning = false;
}