Re: [問題] ctype註冊callback function

看板Python作者 (Victor)時間14年前 (2011/01/27 21:26), 編輯推噓0(004)
留言4則, 1人參與, 最新討論串8/10 (看更多)
※ 引述《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

01/27 21:40, , 1F
ctypes 的文件有強調這一點。
01/27 21:40, 1F

01/27 21:41, , 2F
01/27 21:41, 2F

01/27 21:43, , 3F
你舉的例子碼應該要包含把 cb pass 給 native code 部份
01/27 21:43, 3F

01/27 21:43, , 4F
否則光是看那兩行是沒有問題的。
01/27 21:43, 4F
※ 編輯: StubbornLin 來自: 61.227.233.35 (01/27 22:52) ※ 編輯: StubbornLin 來自: 61.227.233.35 (01/27 22:53)
文章代碼(AID): #1DGNAHnA (Python)
討論串 (同標題文章)
文章代碼(AID): #1DGNAHnA (Python)