作者StubbornLin (Victor)
看板Python
标题Re: [问题] ctype注册callback function
时间Thu Jan 27 21:26:37 2011
※ 引述《cobrasgo (体重突破所有均线)》之铭言:※ 引述《cobrasgo (体重突破所有均线)》之铭言:
: 小弟目前在写程式呼叫期货商的API
: 但是碰到了问题
: 程式如下
我没仔细看,但我看到一个我以前也遇过会引发鬼打墙的错误
就是这里
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_char_p))
cb = CMPFUNC(self._oiCallback)
#register a callback to get open interest status
ret = self._RegisterOnOpenInterestCallBack(addressof(cb))
错在这里,看起来好像没啥问题对吧,一开始我也是这样觉得
但是就是会炸掉,後来发现,主要会炸掉的原因在於
Python是会回收掉reference count的物件
callback没有reference被收掉後 那块空间本来是ctypes建的function
後来被收掉 里面会出现什麽垃圾就不知道了
这就是我之前程式遇到同样奇怪的问题
怎麽解决呢? 很简单 就在callback还会被用到时
都一直要保留住那个refernece
改成这样子
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_char_p))
self.cb = CMPFUNC(self._oiCallback)
#register a callback to get open interest status
ret = self._RegisterOnOpenInterestCallBack(addressof(self.cb))
试试,self.cb一直被保留住 确保在执行时那个callback不会被释放掉
--
Now.in 网路广播电台平台
http://now.in
易记学 程式设计教学
http://ez2learn.com/
VICTOR's 个人Blog
http://blog.ez2learn.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.227.233.35
1F:→ sbrhsieh:ctypes 的文件有强调这一点。 01/27 21:40
3F:→ sbrhsieh:你举的例子码应该要包含把 cb pass 给 native code 部份 01/27 21:43
4F:→ sbrhsieh:否则光是看那两行是没有问题的。 01/27 21:43
※ 编辑: StubbornLin 来自: 61.227.233.35 (01/27 22:52)
※ 编辑: StubbornLin 来自: 61.227.233.35 (01/27 22:53)