使用ctypes或类似工具在Python中包装pthread事件(或Windows信号)

2024-10-04 03:19:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用ctypes访问外部C库中的函数(我只有二进制文件和头文件,没有源文件)。我让它工作了,到目前为止一切正常

现在,可以设置该库来发送事件。库中的setup函数需要传递一个指向事件的指针。这应该用于Windows风格的CreateEvent/WaitForSingleObject信号机制或POSIX类型的pthread方式(顺便说一句,我在Linux下完成所有这些)

这是我现在想在Python中使用的。我不清楚的是:

  • 如何在Python中创建具有正确类型的pthread样式的事件对象,以便将其传递给库,然后库可以对其进行设置
  • 然后,如何监视此事件,以便在每次设置时调用Python函数

我不知道pthread的内部工作原理,也不知道设置事件时实际发生了什么,所以我不知道库真正希望从我这里得到什么类型的对象,以及它将如何处理它。我开始深入研究Linux内核的头文件,以了解pthread_cond__t等是如何定义的,设置事件时会发生什么,等等,但结果证明这是对头文件的无意义的追踪,跟踪结构和联合定义以及嵌套定义;这是我无法理解的

我尝试了几种可用的Python事件实现(参见例Event system in Python),但它们没有pthread类型的事件,而是有自己的Pythonic事件对象。如果我将其中一个传递给FT-lib,要么什么都不会发生,要么它会出错,这是可以理解的,如果您广泛地混合不兼容的类型。因此,这些实现都不适合我的情况(除非我错过了另一个)

我还尝试定义一个大小正确的二进制字节的ctypes blob(由sizeof(pthread_cond_t)等决定);我可以向FTlib传递指向该blob的指针,而不会出现任何segfaults或Python错误,但在事件发生时,我看不到对该blob的任何更改。当然,因为我不知道应该发生什么,也不知道这个事件机制必须提供哪些先决条件才能工作,所以我在这里完全不知道

因此,这种方法,即使我最终可能会让它工作起来,似乎毫无意义,丑陋,也没有多大意义。它还剥夺了原始pthread事件具有的任何互斥功能;因此,必须有更好、更干净的方法

顺便说一句,有PyFtdi,FTDI驱动程序的纯Python实现,还有一些其他驱动程序或包装器,但它们也没有帮助,因为它们a)不支持我正在使用的设备(至少没有这个设备提供的任何特殊功能)和b)它们根本没有实现事件机制。因此,除非我错过了另一个实现,否则这也是不可能的

当然,我在谷歌上搜索了这么多,但找不到任何关于某人正确实现了这一点的提及,尽管我确信以前已经这样做过;对于我来说,必须处理C库发出的pthread事件(或者Windows信号)似乎不是一个非常奇特的应用程序

所以,现在我真的不知道该去哪里看,下一步该尝试什么,我需要一些灵感

编辑:C语言中的代码片段: 基本上,这就是我想在Python中重现的内容

#include <pthread.h>
typedef struct _EVENT_HANDLE
{
    pthread_cond_t  eCondVar;
    pthread_mutex_t eMutex;
    int             iVar;
} EVENT_HANDLE;

int main() {

    EVENT_HANDLE eh; // see type definition above

    // initialize event
    pthread_mutex_init(&eh.eMutex, NULL);
    pthread_cond_init(&eh.eCondVar, NULL);

    // This sets up the event notification: parameter 3 is a pointer to the event.
    // The driver library will set this event.
    ftStatus = FT_SetEventNotification(ftHandle, FT_EVENT_RXCHAR, (PVOID)&eh);

    while(1) {
        // now, wait for the event to happen; the driver library will set it
        pthread_mutex_lock(&eh.eMutex);
        pthread_cond_wait(&eh.eCondVar, &eh.eMutex);
        pthread_mutex_unlock(&eh.eMutex);    
        // do stuff...
    }
}

感谢您的帮助

肖恩


Tags: the对象函数event类型定义事件机制