ctp linux 查询死循环,【求救】CTP-Python在Linux64下段错误

唔,调试了一下,貌似是CTP返回空指针,CTP-Python在包装层没有做处理,造成了段错误。包装层源文件:

--------------------------------------------------------------------------------

//file: wrapper_Trader.cpp

void MySpiWrapper::OnRspQryInstrument(CThostFtdcInstrumentField* pInstrument, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast){

PyGILState_STATE gstate;

gstate=PyGILState_Ensure();

if (!PyObject_CallMethod(py_spi, (char*)"OnRspQryInstrument", (char*)"NNib", new_CThostFtdcInstrumentField(pInstrument), new_CThostFtdcRspInfoField(pRspInfo), nRequestID, bIsLast)){

PyErr_Print();

}

PyGILState_Release(gstate);

}

--------------------------------------------------------------------------------

CTP在响应时,回调参数中的 pRspInfo 有可能是空指针,struct.cpp 中的 new_CThostFtdcRspInfoField() 方法在生成 Python 对象时,发生段错误。

手工将原有的 :

--------------------------------------------------------------------------------

//file: struct.cpp

//响应信息

PyObject * new_CThostFtdcRspInfoField(CThostFtdcRspInfoField * p){

return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", p->ErrorMsg, p->ErrorID);

}

--------------------------------------------------------------------------------

修改为:

--------------------------------------------------------------------------------

//file: struct.cpp

//响应信息

PyObject * new_CThostFtdcRspInfoField(CThostFtdcRspInfoField * p){

if(p == 0){

return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", (char*)"", 0);

}

else{

return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", p->ErrorMsg, p->ErrorID);

}

}

--------------------------------------------------------------------------------

重新编译生成python库,段错误排除。

@lvsoft 老大也许可以考虑打个补丁。

【 在 enceladus (我爱小母牛) 的大作中提到: 】

: 我想起来了,在windows下调试时,好像碰到过类似的错误.不过一共也没几个. 直接在外面加了几个判断.

:  可以去查看下pyctp下面那个Agent.py文件中判断None的语句,交易用到的需要处理的也就是这几个.

:  这个是设计问题,应该用NullObject模式的.

: ...................

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值