看板 Python 關於我們 聯絡資訊
※ 引述《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:http://ppt.cc/bZzp 01/27 21:41
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)