作者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
→ sbrhsieh:ctypes 的文件有強調這一點。 01/27 21:40
→ sbrhsieh:你舉的例子碼應該要包含把 cb pass 給 native code 部份 01/27 21:43
→ sbrhsieh:否則光是看那兩行是沒有問題的。 01/27 21:43
※ 編輯: StubbornLin 來自: 61.227.233.35 (01/27 22:52)
※ 編輯: StubbornLin 來自: 61.227.233.35 (01/27 22:53)