簡體   English   中英

如何制作一個用CFFI包裝的C-DLL來回調python

[英]How to make a C-DLL wrapped with CFFI to callback python

我目前正在嘗試包裝一個 c-dll 來控制通過 USB 連接的相機。 為了從相機獲取圖像數據,SDK-Provider (Thorlabs) 描述了兩種可能性:

  • 循環輪詢相機
  • 使用回調

我包裝了 DLL 並使輪詢方法起作用,它基本上包括調用一個返回 NULL 或掛起幀的方法。

DLL 還提供了將回調函數分配給某些事件的方法,例如相機連接/斷開連接和幀可用。 示例中的 C 代碼如下所示:

void camera_connect_callback(char* cameraSerialNumber, enum USB_PORT_TYPE usb_bus_speed, void* context)
{
    printf("camera %s connected with bus speed = %d!\n", cameraSerialNumber, usb_bus_speed);
}


int main(void)
{

    [...]

    // Set the camera connect event callback. This is used to register for run time camera connect events.
    if (tl_camera_set_camera_connect_callback(camera_connect_callback, 0))
    {
        printf("Failed to set camera connect callback!\n");
        close_sdk_dll();
        return 1;
    }

    [...]
}

我現在的目標是讓回調與 python 一起工作,以便從 dll 調用 python 方法。 因此,我在 API 模式下使用 CFFI 來編譯包裝器,然后嘗試以相同的方式將回調方法傳遞給 DLL:

@ffi.callback("void(char*, void*)")
def disconnect_callback(serialNumber, context):
    print("Disconnect callback was called!")

[...]

print("Set disconnect callback: {}".format(lib.tl_camera_set_camera_disconnect_callback(disconnect_callback, ffi.NULL)))

[...]

出於測試目的,我只在工作輪詢示例中包含了最簡單的回調。 setter 方法返回 0 但該方法永遠不會執行。

這甚至是實現我的目標的正確方法嗎? 我是否需要引入某種線程,以便回調可以中斷剩余程序的順序執行? 關於這個主題的文檔或示例不多,所以我真的希望你們能幫助我。

編輯

所以我嘗試了一個非常基本的例子,它可以工作並且在技術上回答了我的問題,但並沒有解決我的問題。

如果我定義一個 C 回調方法如下:

#include <math.h>

int quadcalc(int input, int (*getval)(int)){
    return (int) pow(getval(input), 2);
}

我可以按預期分配處理程序:(當然是在編譯之后)

@ffi.callback("int(int)")
def callback_func(value):
    return int(rnd.random() * value)


if __name__ == '__main__':
    print(lib.quadcalc(10, callback_func))

一切都按預期進行。 不幸的是,這不適用於實際問題。 所以回調在一般情況下有效,但不是在特定情況下,這就是問題仍然存在的原因。

我是否需要引入某種線程,以便回調可以中斷剩余程序的順序執行?

調用回調方法負責設置備用節目的流捕獲事件,所以它可被路由到要處理的處理程序 當定義的事件發生時,它確實需要處理程序代碼。 例如,這是一個非常通用但完整的代碼示例,它在 C 中使用回調(包括處理函數):

void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

// handler function
int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

在第一個下面有一個同樣好的例子,這里

除此之外, CFFI 文檔中有一個很好的教程第一部分專門解決您的標題問題How to make a C-DLL wrapper with CFFI to callback python

第一部分介紹了一個簡單的工作示例,該示例使用 CFFI 從 Python 調用編譯共享對象 (DLL) 中的 C 函數

步驟是:(有關每個步驟的詳細信息,請參閱上面的鏈接。)
- 創建文件 piapprox_build.py:
- 執行這個腳本:
- 在運行時,您可以像這樣使用擴展模塊:

...在本頁的其余部分,我們將介紹一些更高級的示例和其他 CFFI 模式...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM