我使用ctypes访问外部C库中的函数(我只有二进制文件和头文件,没有源文件)。我让它工作了,到目前为止一切正常
现在,可以设置该库来发送事件。库中的setup函数需要传递一个指向事件的指针。这应该用于Windows风格的CreateEvent/WaitForSingleObject信号机制或POSIX类型的pthread方式(顺便说一句,我在Linux下完成所有这些)
这是我现在想在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...
}
}
感谢您的帮助
肖恩
目前没有回答
相关问题 更多 >
编程相关推荐