打开和关闭与设备的连接
适配器通常打开与它们的设备的连接openDevice ()
函数并关闭它们中的连接closeDevice ()
函数。对于大多数设备,打开到该设备的连接将其保留为独占使用。关闭设备将释放设备。
请注意
工具箱引擎实际上调用IAdaptor
类open ()
成员函数来打开与设备和close ()
函数关闭与设备的连接。这些函数然后调用适配器的函数openDevice ()
而且closeDevice ()
功能。如果适配器需要打开或关闭设备,请使用open ()
而且close ()
函数,而不是调用openDevice ()
或closeDevice ()
直接。
openDevice()的建议算法
的openDevice ()
函数通常执行以下任务。
方法来测试设备是否已经打开
IAdaptor
类isOpen ()
函数。如果设备已经打开,您的openDevice ()
函数应该返回真正的
.如果设备尚未打开,则您的openDevice ()
函数应该使用设备SDK调用建立到设备的连接。启动获取线程。看到启动采办线程为更多的信息。
请注意
只有当适配器使用基于线程的设计时,才需要启动一个单独的线程。适配器也可以使用异步中断(回调)来获取帧,如果设备支持的话。在此场景中,当数据可用时,适配器异步接收通知。有关使用此方法的信息,请参阅设备SDK的文档。
启动采办线程
要启动获取线程,请使用Windows®CreateThread ()
函数。的CreateThread ()
函数创建一个线程,该线程在调用进程的虚拟地址空间中执行。
的CreateThread ()
函数接受这些参数。
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
对于适配器,下表列出了必须设置的参数。有关创建线程的完整信息,请参见微软文档.
参数 |
描述 |
---|---|
|
获取线程过程的地址。指定适配器类头文件中声明的线程过程的名称。看到实现获取线程函数. |
|
指针指向对象本身,即 |
|
变量的地址 |
在你打电话给CreateThread ()
函数时,应用程序通常调用PostThreadMessage ()
函数向新线程发送消息。这将导致系统为线程创建一个消息队列。输入一个循环等待,直到线程确认收到了消息,以确保线程队列已经创建。适配器终止适配器中的线程closeDevice ()
函数——看closeDevice()的建议算法.
示例:打开连接
类的框架实现openDevice ()
函数。
类的存根实现
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;}
为了能够编译和链接适配器,您必须创建您的适配器的存根实现
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
的声明
acquireThread ()
函数,acquireThread
变量,acquireThreadID
变量作为适配器类头文件的私有数据成员。在这个例子中,MyDeviceAdaptor.h
.private: //声明获取线程函数静态DWORD WINAPI acquireThread(void* param);//线程变量HANDLE _acquireThread;// Windows返回的线程ID。DWORD _acquireThreadID;
编译并链接您的适配器。您应该能够创建一个视频输入对象。当你打电话给
开始
函数,验证适配器是否成功创建了获取线程。
closeDevice()的建议算法
的closeDevice ()
函数通常执行以下任务。
测试设备是否已经关闭。如果是,则退出。
对于基于线程设计的适配器,向获取线程发布一条消息以退出,并等待它返回后再退出。有关向线程发布消息的详细信息,请参见向获取线程发送消息.
关闭与获取线程关联的句柄,并将线程句柄变量重置为
零
.
示例:关闭与设备的连接
的框架实现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; }