我的问题
在盈透证券TWS c++ API(或一般的事件驱动编程中(中,何时将状态/模式(这在TWS API中m_state
(更改为"确认"状态至关重要?根据此变量的状态,将调用不同的类方法。在其中一个方法的定义结束时,状态将更改回确认状态,这似乎允许主机接收消息。我可以将m_state
更改为其他内容,并完全跳过确认过程吗?
为不了解TWS API的用户提供的一些背景信息
(请随意忽略此部分(
盈透证券的TWS C++API有数万行代码,所以让我试着描述一下我认为的基本功能是什么。
Main.cpp
中的程序入口点实例化客户端对象,然后在 while 循环的每次迭代中一遍又一遍地重复调用其void TestCppClient::processMessages()
方法。
一方面,每当经纪人决定调用它们时,经纪人就会触发一堆方法,而您作为客户可能会也可能不会利用所提供的信息。
但另一方面,有一堆方法是由我的客户端代码触发的。根据m_state
的值,触发不同的类方法。在 IB 提供的示例代码中,即在我的TestCppClient
类中,这些函数中的大多数都提供了一些有用的演示代码,更重要的是,这些函数中的大多数都有最后一行将m_state
的值设置为以_ACK
结尾的东西(我相信,这是一种套接字编程约定,是"确认"的缩写。
例如,当m_state
等于ST_REUTERSFUNDAMENTALS
时,TestCppClient::processMessages()
的switch
语句将触发TestCppClient::reutersFundamentals()
。此方法定义的最后一行是
m_state = ST_REUTERSFUNDAMENTALS_ACK;
下次触发void TestCppClient::processMessages()
时(如果您还记得的话,它一直由 while 循环触发(由于只有一个break
语句而被跳过 switch 语句:
...
case ST_REUTERSFUNDAMENTALS:
reutersFundamentals();
break;
case ST_REUTERSFUNDAMENTALS_ACK:
break;
...
此 switch 语句代码构成了此函数定义中的大部分代码,但在 switch 语句之外的末尾有一点代码。在这种情况下,唯一以TestCppClient::procesMessages()
运行的代码是在最后,即
m_pReader->checkClient();
m_osSignal.waitForSignal();
m_pReader->processMsgs();
这些行显然处理一些低级套接字编程的东西。
重申我的问题
因此,如果我不将状态更改为确认状态,则最后三行将不会运行。但这会是一件坏事吗?有人有这方面的经验吗?有什么轶事信息吗?
随着 IB/C++ 应用程序的运行,TestCppClient
示例相当复杂,但这三行很重要。m_pReader
是EReader
类的一个实例,该类读取传入数据并生成消息。因为它在自己的线程中运行,所以需要特殊处理。
checkClient
函数告诉EReader
将传入数据打包到EMessage
中,并将消息存储在消息队列中。但是,在waitForSignal
函数返回之前,应用程序无法访问队列。之后,processMsgs
读取EMessage
并调用相应的回调函数。
处理EReader
很痛苦,但是一旦应用程序正常工作,就可以将代码复制并粘贴到其他应用程序中。
是的,您只需删除所有m_state
开关即可。 您可能会注意到m_state
的ST_
部分(开始(最终在函数nextValidId()
中被触发。在processMessages()
函数中,ST
条件调用客户端函数,之后,m_state
被翻转到ACK
然后中断 - 只有相关的部分,如果你要使用processMessages()
来处理msg que是m_osSignal.waitForSignal(); errno = 0; m_pReader->processMsgs();
可以在processMessages()
之外调用。基本上,当使用任何功能时,您可以注释掉所有m_state
开关。 但仍然需要等待信号,根据需要处理消息。似乎m_state
只是方便测试平台和快速测试功能,只评论/取消评论你想玩的东西。