Skip to content

Commit a182df8

Browse files
committed
优化TDX的断开连接功能
1 parent 7e8c2f0 commit a182df8

9 files changed

Lines changed: 80 additions & 52 deletions

File tree

apis/Tdx_Trade/SingleUser.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ CSingleUser::CSingleUser(CTraderApi* pApi)
6262
m_pApi = pApi;
6363
m_pClient = nullptr;
6464
memset(m_UserID, 0, sizeof(m_UserID));
65+
66+
m_ConnectionStatus = ConnectionStatus::ConnectionStatus_Uninitialized;
6567
}
6668

6769

@@ -84,6 +86,9 @@ void CSingleUser::OutputQueryTime(time_t t, double db, const char* szSource)
8486

8587
void CSingleUser::CheckThenQueryOrder(time_t _now)
8688
{
89+
if (m_ConnectionStatus != ConnectionStatus::ConnectionStatus_Done)
90+
return;
91+
8792
if (_now > m_QueryOrderTime)
8893
{
8994
double _queryTime = QUERY_TIME_MAX;
@@ -96,6 +101,9 @@ void CSingleUser::CheckThenQueryOrder(time_t _now)
96101

97102
void CSingleUser::CheckThenQueryTrade(time_t _now)
98103
{
104+
if (m_ConnectionStatus != ConnectionStatus::ConnectionStatus_Done)
105+
return;
106+
99107
if (_now > m_QueryTradeTime)
100108
{
101109
double _queryTime = QUERY_TIME_MAX;
@@ -643,14 +651,13 @@ int CSingleUser::OnResponse_ReqUserLogin(CTdxApi* pApi, RequestResponse_STRUCT*
643651
strcpy(pField->Text, pRespone->pErr->ErrInfo);
644652

645653
m_msgQueue->Input_NoCopy(ResponseType::ResponseType_OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Disconnected, 0, pField, sizeof(RspUserLoginField), nullptr, 0, nullptr, 0);
646-
654+
m_ConnectionStatus = ConnectionStatus::ConnectionStatus_Disconnected;
647655
m_pApi->RemoveUser((CSingleUser*)pRespone->pUserData_Public);
648656
}
649657
else
650658
{
651659
m_msgQueue->Input_NoCopy(ResponseType::ResponseType_OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Logined, 0, nullptr, 0, nullptr, 0, nullptr, 0);
652-
653-
m_pApi->StartQueryThread();
660+
m_ConnectionStatus = ConnectionStatus::ConnectionStatus_Logined;
654661
}
655662

656663
// 查询股东列表,华泰证券可能一开始查会返回非知请求[1122]
@@ -671,6 +678,7 @@ int CSingleUser::OnResponse_ReqUserLogin(CTdxApi* pApi, RequestResponse_STRUCT*
671678
}
672679

673680
m_msgQueue->Input_NoCopy(ResponseType::ResponseType_OnConnectionStatus, m_msgQueue, m_pClass, ConnectionStatus::ConnectionStatus_Done, 0, nullptr, 0, nullptr, 0, nullptr, 0);
681+
m_ConnectionStatus = ConnectionStatus::ConnectionStatus_Done;
674682
}
675683

676684
// 这是由TdxApi.dll创建的

apis/Tdx_Trade/SingleUser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,6 @@ class CSingleUser
7070
void* m_pClass;
7171
CMsgQueue* m_msgQueue;
7272
char m_UserID[64];
73+
ConnectionStatus m_ConnectionStatus;
7374
};
7475

apis/Tdx_Trade/TraderApi.cpp

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ void CTraderApi::QueryInThread(char type, void* pApi1, void* pApi2, double doubl
3636
case E_Init:
3737
iRet = _Init();
3838
break;
39+
case E_Disconnect:
40+
_Disconnect(true);
41+
// 不再循环
42+
return;
3943
case E_ReqUserLoginField:
4044
iRet = _ReqUserLogin(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
4145
break;
@@ -74,16 +78,26 @@ void CTraderApi::QueryInThread(char type, void* pApi1, void* pApi2, double doubl
7478
m_nSleep *= 4;
7579
m_nSleep %= 1023;
7680
}
81+
82+
// 将时定时查询功能放在查询队列中,这样退出就不会出问题了
83+
// 由于队列中一直没有东西,所以不会再来触发这个循环,需要隔一定的时间向队列中放一个,最好放在最后
84+
TestInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
85+
if (m_msgQueue_Query->Size() == 0)
86+
{
87+
m_msgQueue_Query->Input_Copy(E_Heartbeat, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
88+
m_nSleep = 32;
89+
}
90+
7791
this_thread::sleep_for(chrono::milliseconds(m_nSleep));
7892
}
7993

80-
void* __stdcall Test(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
81-
{
82-
// 由内部调用,不用检查是否为空
83-
CTraderApi* pApi = (CTraderApi*)pApi2;
84-
pApi->TestInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
85-
return nullptr;
86-
}
94+
//void* __stdcall Test(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
95+
//{
96+
// // 由内部调用,不用检查是否为空
97+
// CTraderApi* pApi = (CTraderApi*)pApi2;
98+
// pApi->TestInThread(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
99+
// return nullptr;
100+
//}
87101

88102
void CTraderApi::TestInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3)
89103
{
@@ -95,9 +109,6 @@ void CTraderApi::TestInThread(char type, void* pApi1, void* pApi2, double double
95109
pUser->CheckThenQueryOrder(_now);
96110
pUser->CheckThenQueryTrade(_now);
97111
}
98-
99-
this_thread::sleep_for(chrono::milliseconds(1000));
100-
m_msgQueue_Test->Input_Copy(type, pApi1, pApi2, double1, double2, ptr1, size1, ptr2, size2, ptr3, size3);
101112
}
102113

103114
void CTraderApi::OnResponse(CTdxApi* pApi, RequestResponse_STRUCT* pRespone)
@@ -257,12 +268,6 @@ int CTraderApi::_ReqUserLogin(char type, void* pApi1, void* pApi2, double double
257268
return 0;
258269
}
259270

260-
void CTraderApi::StartQueryThread()
261-
{
262-
// 启动定时查询功能使用
263-
m_msgQueue_Test->Input_Copy(ResponseType::ResponseType_OnRtnOrder, m_msgQueue_Test, this, 0, 0, nullptr, 0, nullptr, 0, nullptr, 0);
264-
}
265-
266271
void CTraderApi::RemoveUser(CSingleUser* pUser)
267272
{
268273
m_UserID_User_Map.erase(pUser->m_UserID);
@@ -370,21 +375,17 @@ CTraderApi::CTraderApi(void)
370375
// 自己维护两个消息队列
371376
m_msgQueue = new CMsgQueue();
372377
m_msgQueue_Query = new CMsgQueue();
373-
m_msgQueue_Test = new CMsgQueue();
374378

375379
m_msgQueue_Query->Register(Query,this);
376380
m_msgQueue_Query->StartThread();
377381

378-
m_msgQueue_Test->Register(Test, this);
379-
m_msgQueue_Test->StartThread();
380-
381382
m_pDefaultUser = nullptr;
382383
}
383384

384385

385386
CTraderApi::~CTraderApi(void)
386387
{
387-
Disconnect();
388+
_Disconnect(false);
388389
}
389390

390391
void CTraderApi::Register(void* pCallback, void* pClass)
@@ -394,19 +395,16 @@ void CTraderApi::Register(void* pCallback, void* pClass)
394395
return;
395396

396397
m_msgQueue_Query->Register(Query,this);
397-
m_msgQueue_Test->Register(Test, this);
398398
m_msgQueue->Register(pCallback,this);
399399
if (pCallback)
400400
{
401401
m_msgQueue_Query->StartThread();
402402
m_msgQueue->StartThread();
403-
m_msgQueue_Test->StartThread();
404403
}
405404
else
406405
{
407406
m_msgQueue_Query->StopThread();
408407
m_msgQueue->StopThread();
409-
m_msgQueue_Test->StopThread();
410408
}
411409
}
412410

@@ -449,22 +447,31 @@ void CTraderApi::Connect(const string& szPath,
449447

450448
void CTraderApi::Disconnect()
451449
{
452-
if (m_msgQueue_Query)
450+
_Disconnect(false);
451+
}
452+
453+
void CTraderApi::_DisconnectInThread()
454+
{
455+
m_msgQueue_Query->Input_NoCopy(RequestType::E_Disconnect, m_msgQueue_Query, this, 0, 0,
456+
nullptr, 0, nullptr, 0, nullptr, 0);
457+
}
458+
459+
void CTraderApi::_Disconnect(bool IsInQueue)
460+
{
461+
if (IsInQueue)
453462
{
454-
m_msgQueue_Query->StopThread();
455-
m_msgQueue_Query->Register(nullptr,nullptr);
456-
m_msgQueue_Query->Clear();
457-
delete m_msgQueue_Query;
458-
m_msgQueue_Query = nullptr;
459-
}
460463

461-
if (m_msgQueue_Test)
464+
}
465+
else
462466
{
463-
m_msgQueue_Test->StopThread();
464-
m_msgQueue_Test->Register(nullptr, nullptr);
465-
m_msgQueue_Test->Clear();
466-
delete m_msgQueue_Test;
467-
m_msgQueue_Test = nullptr;
467+
if (m_msgQueue_Query)
468+
{
469+
m_msgQueue_Query->StopThread();
470+
m_msgQueue_Query->Register(nullptr, nullptr);
471+
m_msgQueue_Query->Clear();
472+
delete m_msgQueue_Query;
473+
m_msgQueue_Query = nullptr;
474+
}
468475
}
469476

470477
if(m_pApi)

apis/Tdx_Trade/TraderApi.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class CTraderApi:public CTdxSpi
5252
enum RequestType
5353
{
5454
E_Init = 100,
55+
E_Disconnect,
5556
E_ReqUserLoginField,
5657
E_QryInvestorField,
5758
E_InputOrderField,
@@ -76,6 +77,7 @@ class CTraderApi:public CTdxSpi
7677
E_QryQuoteField,
7778

7879
E_ReqQueryData_STRUCT,
80+
E_Heartbeat,
7981
};
8082

8183
public:
@@ -108,7 +110,6 @@ class CTraderApi:public CTdxSpi
108110

109111
void Subscribe(const string& szInstrumentIDs, const string& szExchangeID);
110112

111-
void StartQueryThread();
112113
void RemoveUser(CSingleUser* pUser);
113114

114115
private:
@@ -117,12 +118,13 @@ class CTraderApi:public CTdxSpi
117118
friend void* __stdcall Query(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
118119
virtual void QueryInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
119120

120-
friend void* __stdcall Test(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
121+
//friend void* __stdcall Test(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
121122
virtual void TestInThread(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
122123

123124
int _Init();
124125
int _ReqQuery(char type, void* pApi1, void* pApi2, double double1, double double2, void* ptr1, int size1, void* ptr2, int size2, void* ptr3, int size3);
125-
126+
void _Disconnect(bool IsInQueue);
127+
void _DisconnectInThread();
126128

127129
//登录请求
128130
void ReqUserLogin();
@@ -146,7 +148,7 @@ class CTraderApi:public CTdxSpi
146148
//检查是否出错
147149
//bool IsErrorRspInfo(Error_STRUCT *pRspInfo, int nRequestID, bool bIsLast);//向消息队列输出信息
148150
bool IsErrorRspInfo(const char* szSource, Error_STRUCT *pRspInfo);//不输出信息
149-
void OutputQueryTime(time_t t, double db,const char* szSource);
151+
//void OutputQueryTime(time_t t, double db,const char* szSource);
150152

151153
CSingleUser* Fill_UserID_Client(char* khh, void** Client);
152154

@@ -175,9 +177,7 @@ class CTraderApi:public CTdxSpi
175177

176178

177179
CMsgQueue* m_msgQueue; //消息队列指针
178-
CMsgQueue* m_msgQueue_Query; //发送消息队列指针
179-
CMsgQueue* m_msgQueue_Order; //报单消息队列指针
180-
CMsgQueue* m_msgQueue_Test; //测试用
180+
CMsgQueue* m_msgQueue_Query; //测试用
181181

182182
UserInfoField* m_pUserInfos;
183183
int m_UserInfo_Pos;

apis/Tdx_Trade/TypeConvert.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ int BJFS_str_2_int(char* pIn)
109109
{
110110
return WTFS_Best_Forward;
111111
}
112+
char* pH = strstr(pIn, ""); // 回购
113+
if (pH)
114+
{
115+
return WTFS_Limit;
116+
}
112117
}
113118

114119
return WTFS_Limit;

common/Queue/MsgQueue.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ class QUEUE_DLL_PUBLIC CMsgQueue
4141
public:
4242
//清空队列
4343
void Clear();
44+
unsigned long Size()
45+
{
46+
return m_queue.size();
47+
}
4448

4549
//可以由外部发起,顺序处理队列触发回调函数
4650
bool Process();

include/Tdx/tdx_function.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -798,13 +798,16 @@ void CharTable2Login(FieldInfo_STRUCT** ppFieldInfos, char** ppTable, GDLB_STRUC
798798
while (p != nullptr)
799799
{
800800
char * flag = ppTable[i * COL_EACH_ROW + 10];
801-
if (strcmp(flag, "资金帐号") == 0)
801+
if (flag)
802802
{
803-
ppResults[pos] = new GDLB_STRUCT();
803+
if (strcmp(flag, "资金帐号") == 0)
804+
{
805+
ppResults[pos] = new GDLB_STRUCT();
804806

805-
strcpy_s(ppResults[pos]->ZJZH, ppTable[i * COL_EACH_ROW + 0]);
806-
strcpy_s(ppResults[pos]->GDMC, ppTable[i * COL_EACH_ROW + 1]);
807-
++pos;
807+
strcpy_s(ppResults[pos]->ZJZH, ppTable[i * COL_EACH_ROW + 0]);
808+
strcpy_s(ppResults[pos]->GDMC, ppTable[i * COL_EACH_ROW + 1]);
809+
++pos;
810+
}
808811
}
809812

810813
++i;

include/Tdx/win32/TdxApi.dll

-5 KB
Binary file not shown.

include/Tdx/win32/TdxApi.lib

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)