0

我正在使用 ctypes 访问外部 C 库中的函数(我只有二进制文件和头文件,没有源代码)。我得到了这个工作,到目前为止一切都很好。

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

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

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

我不知道 pthread 的内部工作原理以及设置事件时实际发生的情况,所以我不知道库真正期望我提供什么样的对象以及它将如何处理它。我开始深入研究 Linux 内核头文件以了解如何定义 pthread_cond_t 等,设置事件时会发生什么等等,但结果证明这是对头文件、跟踪结构和联合定义以及嵌套定义的毫无意义的追逐; 这超出了我的范围。

我尝试了几种可用的 Python 事件实现(参见例如Python 中的事件系统),但它们没有 pthread 类型的事件,而是它们自己的 Pythonic 事件对象。如果我将其中一个传递给 FT 库,则要么根本没有任何反应,要么会出现段错误,如果您疯狂地混合不兼容的类型,这是可以理解的。所以这些实现都不适合我的情况(除非我错过了另一个)。

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

所以这种方法,即使我最终可能让它工作,看起来毫无意义,丑陋并且没有多大意义。它还剥夺了我原来 pthread-event 所具有的任何互斥锁功能;所以必须有一个更好,更清洁的方法。

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

当然,我用谷歌搜索并搜索了 SO,但找不到任何人已经正确实施了这一点,即使我确信以前已经这样做过;必须处理从 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...
    }
}

任何帮助表示赞赏,

肖恩

4

0 回答 0