主要内容

打开和关闭与设备的连接

适配器通常打开与它们的设备的连接openDevice ()函数并关闭它们中的连接closeDevice ()函数。对于大多数设备,打开到该设备的连接将其保留为独占使用。关闭设备将释放设备。

请注意

工具箱引擎实际上调用IAdaptoropen ()成员函数来打开与设备和close ()函数关闭与设备的连接。这些函数然后调用适配器的函数openDevice ()而且closeDevice ()功能。如果适配器需要打开或关闭设备,请使用open ()而且close ()函数,而不是调用openDevice ()closeDevice ()直接。

openDevice()的建议算法

openDevice ()函数通常执行以下任务。

  1. 方法来测试设备是否已经打开IAdaptorisOpen ()函数。如果设备已经打开,您的openDevice ()函数应该返回真正的.如果设备尚未打开,则您的openDevice ()函数应该使用设备SDK调用建立到设备的连接。

  2. 启动获取线程。看到启动采办线程为更多的信息。

    请注意

    只有当适配器使用基于线程的设计时,才需要启动一个单独的线程。适配器也可以使用异步中断(回调)来获取帧,如果设备支持的话。在此场景中,当数据可用时,适配器异步接收通知。有关使用此方法的信息,请参阅设备SDK的文档。

启动采办线程

要启动获取线程,请使用Windows®CreateThread ()函数。的CreateThread ()函数创建一个线程,该线程在调用进程的虚拟地址空间中执行。

CreateThread ()函数接受这些参数。

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

对于适配器,下表列出了必须设置的参数。有关创建线程的完整信息,请参见微软文档

参数

描述

lpStartAddress

获取线程过程的地址。指定适配器类头文件中声明的线程过程的名称。看到实现获取线程函数

lpParameter

指针指向对象本身,即指针。

lpThreadId

变量的地址CreateThread ()函数返回分配给新创建线程的ID

在你打电话给CreateThread ()函数时,应用程序通常调用PostThreadMessage ()函数向新线程发送消息。这将导致系统为线程创建一个消息队列。输入一个循环等待,直到线程确认收到了消息,以确保线程队列已经创建。适配器终止适配器中的线程closeDevice ()函数——看closeDevice()的建议算法

示例:打开连接

类的框架实现openDevice ()函数。

  1. 类的存根实现openDevice ()功能MyDevice适配器与此代码。

    bool MyDeviceAdaptor::openDevice(){//如果设备已经打开,返回true。if (isOpen())返回true;//创建图像采集线程。_acquireThread = CreateThread(NULL, 0, acquireThread, this, 0, &_acquireThreadID);if (_acquireThread == NULL) {closeDevice();返回错误;} //等待线程创建消息队列。while(PostThreadMessage(_acquireThreadID,WM_USER+1,0,0) == 0) Sleep(1);返回true;}
  2. 为了能够编译和链接适配器,您必须创建您的适配器的存根实现acquireThread ()函数并将其添加到适配器。您可以稍后填写完整的实现—参见实现获取线程函数

    WINAPI MyDeviceAdaptor::acquireThread(void* param) {MSG MSG;while (GetMessage(&msg,NULL,0,0) > 0) {switch (msg.message) {case WM_USER: //帧采集循环代码在这里。imaqkit::adaptorWarn(“在获取线程函数\n”);} //结束开关}//结束时返回0;} //结束acquireThread
  3. 的声明acquireThread ()函数,acquireThread变量,acquireThreadID变量作为适配器类头文件的私有数据成员。在这个例子中,MyDeviceAdaptor.h

    private: //声明获取线程函数静态DWORD WINAPI acquireThread(void* param);//线程变量HANDLE _acquireThread;// Windows返回的线程ID。DWORD _acquireThreadID;
  4. 编译并链接您的适配器。您应该能够创建一个视频输入对象。当你打电话给开始函数,验证适配器是否成功创建了获取线程。

closeDevice()的建议算法

closeDevice ()函数通常执行以下任务。

  1. 测试设备是否已经关闭。如果是,则退出。

  2. 对于基于线程设计的适配器,向获取线程发布一条消息以退出,并等待它返回后再退出。有关向线程发布消息的详细信息,请参见向获取线程发送消息

  3. 关闭与获取线程关联的句柄,并将线程句柄变量重置为

示例:关闭与设备的连接

的框架实现closeDevice ()函数。

bool MyDeviceAdaptor::closeDevice(){//如果设备未打开,返回。if (!isOpen())返回true;//终止并关闭获取线程。if (_acquireThread){//发送WM_QUIT消息给线程。PostThreadMessage(_acquireThreadID, WM_QUIT, 0,0);//给线程一个完成的机会。WaitForSingleObject (_acquireThread, 10000);//关闭线程句柄。CloseHandle (_acquireThread);_acquireThread =零; } return true; }
Baidu
map