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