测试发现,如果前置机地址错误,RegisterFront(FRONT_ADDR)无异常,但Join()后一直无返回

Discussion in 'CTP' started by hyhard, Aug 17, 2014.

  1. 用一个失效的前置机地址时发现这一问题

    之前看文档,说Init()连接成功后回调 OnFrontConnected(),但实际测试发现是在Join()时回调的,
    于是随便用一个IP地址测试时发现,一旦前置机地址错误(比如期货公司变更IP),则Join()会一直无返回,这样程序无法判断处于什么状态,是不是有一个超时期限,我等了好久也没见返回
     
  2. 保证前置机地址正确。或者设定个时限,当超时时onFrontConnected还未返回信号,认定前置机地址有问题,或者前置机没有运行。Join没必要用,它的作用是阻止当前线程,直到MdApi,TraderApi中的线程退出为止
     
  3. 你说没必要用Join(),这个我不是很明白,Init()这个函数好像什么都没做,只有调用Join()后,CTraderSpi::OnFrontConnected()才会被回调,我的登录请求就是在这个回调里发出的,如果不用Join(),那怎么登录呢?
     
  4. 确实没必要用Join,Init之后 MD 或者 Trader 就开启socket,连接,接受发送线程 就开始工作了。

    你遇到这个 Join才回调的 情况很奇特。
    可能是 头文件 库文件 估计是导出符号lib 和dll 版本不一致,链接的时候 Init的dll入口地址 和 实际dll的入口地址 不一致。
     
  5. 我刚才用v6.2.5版的又试了一下,也是在Join中回调的,而且无论用什么IP,都会进入Join工作线程,并且不会返回,所以我想如果期货公司服务器当机情况下,自已的交易程序怎样发现并更换前置机呢
    开发文档说可以注册多个前置机,所以我同时注册了三个前置机:
    pUserApi->RegisterFront(FrontAddA);
    pUserApi->RegisterFront(FrontAddB);
    pUserApi->RegisterFront(FrontAddC);
    但是由于RegisterFront没有返回信息,也不清楚是否注册成功,
    所以整个过程中,无论是否Join都无法判断是否连接成功,或者是否掉线,又或者服务器是否有效

    以前,CTP是托管模式,所以服务器肯定有效,现在很多都是自建机房,服务器是否可用还是应该要检查一下吧
     
  6. 实际上确实是在Init之后 ,Spi线程即数据接收线程,也即回调线程就启动了。你发现在Join中回调只是因为你用Init发现直接返回,切断了Spi子线程,所以你没看到OnConnected的输出,就认为没回调。(我猜测是这种情况)
    而Join没有返回,自然你就看到OnConn的输出了。Join当然不会返回了,因为实现机制是 conditional_wait ,等待子线程的退出信号 。

    你目前急需解决的问题是:如何确认 是否连接成功。然后遇到了上述问题。所以必须了解Init和 Join之后分别发生了什么事情。 看你的描述估计 需要看看多线程 最基本的概念即可理解。

    方案 “一马当先” 兄 说的很明白,另外开一个死循环计时器线程,每隔X秒 check一个 bool 变量。
    MD或者Trader线程在Init 之后就返回,不要用Join 。然后在OnConnect 里面 set bool 为T ,
    当然那个计时器线程 也可以是策略线程。总之 不要把 MD 或者 Trader 作为主线程。
    把策略线程或者 策略管理器 等等这种主框架 作为 主线程 一直运行。
     
  7. 谢谢解释,之前用的是官方样例,现在我在Init后面加上Sleep(5000),果然发现是在Join之前就返回了.
    我对编程不太了解,以前只接触过C,现在用C++要一边看书一边复制粘贴代码,多线程的知识我再看看

    另外也谢谢一马当先的回复
     
  8. 刚才又用TCPview看了一下,同时注册多个前置机是可行的
    pUserApi->RegisterFront(FrontAddA);
    pUserApi->RegisterFront(FrontAddB);
    Init()调用时,好像会自动选择一个比较快的地址,我注册了一个电信一个联通,改变注册先后顺序,Init()都会自动选择电信服务器(我是电信网络)
    连接后,在TCPview中关闭当前连接,程序会立即自动建立与另一个前置机的连接.
    之前一直担心OnFrontDisconnected中的自动重连间隔时间有多长,现在看来倒不用担心