亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python(ctypes)中的回調問題

python(ctypes)中的回調問題

慕婉清6462132 2022-10-06 16:19:52
我在 python 中遇到了 CTYPES 的問題。我已經準備好帶有一些回調的 dll 庫。在 swift 上一切正常,但我在 python 中有一些問題。Python:def set_up_callback(self):    self.lib.set_callback(self.callback1)@CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)def callback1( a, b, c, time):    print(a, b, c, time)c++回調聲明typedef void(*callbackType)(float, float, float, uint64_t, void*);        callbackType callback;void* context;C++ 初始化void setCallback(callbackType callback, void* context) {        this->context = context;        this->callback = callback;}C++ 歸納callback(1.5f, 2.4f, 1.3f, timestamp, context);共享.hextern "C" void SHARED_EXPORT set_callback(callbackType callback, void* context);這很好用,但我想要selfIn 回調函數,所以我試試這個def set_up_callback(self):    callback_type = CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)    callback = callback_type(self.callback1)    self.lib.set_callback(callback)def callback1(self, a, b, c, time):    print(a, b, c, time)通過這個嘗試我有錯誤Segmentation fault: 11預先感謝您的幫助
查看完整描述

1 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

In set_up_callback,callback是一個局部變量,在調用 后超出范圍self.lib.set_callback(callback)。callback您必須在可以調用的生命周期內保留對的引用,因此將其存儲為類實例的成員變量。


工作演示:


演示.cpp


#include <time.h>

#include <stdint.h>


#if defined(_WIN32)

#   define API __declspec(dllexport)

#else

#   define API

#endif


typedef void(*CALLBACK)(float, float, float, uint64_t, void*);


CALLBACK g_callback;


extern "C" {


API void set_callback(CALLBACK callback) {

    g_callback = callback;

}


API void demo(void* context) {

    if(g_callback)

        g_callback(1.5f, 2.4f, 1.3f, time(nullptr), context);

}


}

演示.py


from ctypes import *

from datetime import datetime


CALLBACK = CFUNCTYPE(None,c_float,c_float,c_float,c_uint64,c_void_p)


class Demo:

    def __init__(self):

        self.lib = CDLL('./demo')

        self.lib.set_callback.argtypes = CALLBACK,

        self.lib.set_callback.restype = None

        self.lib.demo.argtypes = c_void_p,

        self.lib.demo.restype = None

        self.set_up_callback()


    def callback(self,a,b,c,timestamp,context):

        print(a,b,c,datetime.fromtimestamp(timestamp),self.context)


    def set_up_callback(self):

        self.callback = CALLBACK(self.callback)

        self.lib.set_callback(self.callback)


    def demo(self,context):

        self.context = context

        self.lib.demo(None)


demo = Demo()

demo.demo([1,2,3])

demo.demo(123.456)

demo.demo('a context')

輸出:


1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 [1, 2, 3]

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 123.456

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 a context


查看完整回答
反對 回復 2022-10-06
  • 1 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號