@@ -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
88102void 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
103114void 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-
266271void 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
385386CTraderApi::~CTraderApi (void )
386387{
387- Disconnect ( );
388+ _Disconnect ( false );
388389}
389390
390391void 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
450448void 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)
0 commit comments