Адаптеры обычно открывают соединение с устройством в своих openDevice()
функционировать и закрыть соединение в своих closeDevice()
функция. Для большинства устройств открытие подключения к устройству резервирует его для эксклюзивного использования. Закрытие устройства освобождает устройство.
Примечание
Механизм тулбокса на самом деле вызывает IAdaptor
классы open()
Представитель функцию, чтобы открыть соединение с устройством и close()
функция для закрытия соединения с устройством. Затем эти функции вызывают openDevice()
вашего адаптера и
closeDevice()
функций. Если вашему адаптеру нужно открыть или закрыть устройство, используйте open()
и close()
функции, а не вызов openDevice()
или closeDevice()
непосредственно.
The openDevice()
функция обычно выполняет следующие задачи.
Проверьте, открыто ли устройство, позвонив в IAdaptor
классы isOpen()
функция. Если устройство уже открыто, ваш openDevice()
функция должна возвращаться true
. Если устройство еще не открыто, ваш openDevice()
функция должна установить соединение с устройством с помощью вызовов SDK устройства.
Запустите поток сбора. Для получения дополнительной информации см. раздел «Запуск потока сбора».
Примечание
Запуск отдельного потока требуется только, если ваш адаптер использует проект на основе потоков. Адаптеры также могут использовать асинхронные прерывания (коллбэки) для получения систем координат, если устройство поддерживает это. В этом сценарии адаптеры получают уведомление асинхронно, когда данные доступны. Для получения информации об использовании этого метода см. документацию по SDK вашего устройства.
Чтобы запустить поток сбора, используйте Windows® CreateThread()
функция. The CreateThread()
функция создает поток, который выполняется в виртуальном адресном пространстве вызова процесса.
The CreateThread()
функция принимает эти параметры.
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );
Для адаптера в следующей таблице перечислены параметры, которые вы должны задать. Полную информацию о создании потока см. в Microsoft Docs.
Параметр | Описание |
---|---|
| Адрес процедуры получения потока. Укажите имя процедуры потока, объявленной в файле заголовка класса адаптера. См. «Реализация функции потока сбора». |
| Указатель на сам объект, т.е. |
| Адрес переменной, в которой |
После вызова CreateThread()
function, приложения обычно вызывают PostThreadMessage()
функция для отправки сообщения новому потоку. Это заставляет систему создавать очередь сообщений для потока. Введите цикл, чтобы дождаться, пока поток подтвердит, что сообщение было получено, чтобы убедиться, что очередь потоков создана. Адаптер завершает поток в closeDevice()
адаптера function - см. Предлагаемый алгоритм для closeDevice ().
Этот пример показывает скелетную реализацию openDevice()
функция.
Замените заглушку реализации openDevice()
функция в MyDevice
адаптер с этим кодом.
bool MyDeviceAdaptor::openDevice() { // If device is already open, return true. if (isOpen()) return true; // Create the image acquistion thread. _acquireThread = CreateThread(NULL, 0, acquireThread, this, 0, &_acquireThreadID); if (_acquireThread == NULL) { closeDevice(); return false; } // Wait for thread to create message queue. while(PostThreadMessage(_acquireThreadID,WM_USER+1,0,0) == 0) Sleep(1); return true; }
Чтобы иметь возможность компилировать и связать ваш адаптер, вы должны создать заглушку реализации вашего acquireThread()
и добавьте его к своему адаптеру. Полную реализацию можно заполнить позже - см. «Реализация функции потока поступлений».
DWORD WINAPI MyDeviceAdaptor::acquireThread(void* param) { MSG msg; while (GetMessage(&msg,NULL,0,0) > 0) { switch (msg.message) { case WM_USER: // The frame acquisition loop code goes here. imaqkit::adaptorWarn(''in acquire thread function \n''); } // end switch } // end while return 0; } // end acquireThread
Добавьте объявления acquireThread()
function, the acquireThread
переменная и acquireThreadID
переменная как частные представители данных файла заголовка класса адаптера. В этом примере MyDeviceAdaptor.h
.
private: // Declaration of acquisition thread function static DWORD WINAPI acquireThread(void* param); // Thread variable HANDLE _acquireThread; // Thread ID returned by Windows. DWORD _acquireThreadID;
Скомпилируйте и соедините адаптер. Вы должны иметь возможность создать объект входа видео. Когда вы вызываете start
проверьте, что адаптер успешно создал поток сбора.
The closeDevice()
функция обычно выполняет следующие задачи.
Проверьте, закрыто ли устройство. Если это так, выход.
Отправьте сообщение в поток сбора, чтобы выйти и подождать, пока он вернется до выхода, для адаптеров с проектами на основе потоков. Дополнительные сведения о размещении сообщения в потоке см. в разделе Отправка сообщения в поток сбора.
Закройте указатель, сопоставленный с установочной резьбой, и сбросьте переменную указателя на NULL
.
Пример показывает скелетную реализацию closeDevice()
функция.
bool MyDeviceAdaptor::closeDevice(){ // If the device is not open, return. if (!isOpen()) return true; // Terminate and close the acquisition thread. if (_acquireThread) { // Send WM_QUIT message to thread. PostThreadMessage(_acquireThreadID, WM_QUIT, 0, 0); // Give the thread a chance to finish. WaitForSingleObject(_acquireThread, 10000); // Close thread handle. CloseHandle(_acquireThread); _acquireThread = NULL; } return true; }