Открытие и закрытие соединения с устройством

Адаптеры обычно открывают соединение с устройством в своих openDevice() функционировать и закрыть соединение в своих closeDevice() функция. Для большинства устройств открытие подключения к устройству резервирует его для эксклюзивного использования. Закрытие устройства освобождает устройство.

Примечание

Механизм тулбокса на самом деле вызывает IAdaptor классы open() Представитель функцию, чтобы открыть соединение с устройством и close() функция для закрытия соединения с устройством. Затем эти функции вызывают openDevice() вашего адаптера и closeDevice() функций. Если вашему адаптеру нужно открыть или закрыть устройство, используйте open() и close() функции, а не вызов openDevice() или closeDevice() непосредственно.

Предложенный алгоритм для openDevice ()

The openDevice() функция обычно выполняет следующие задачи.

  1. Проверьте, открыто ли устройство, позвонив в IAdaptor классы isOpen() функция. Если устройство уже открыто, ваш openDevice() функция должна возвращаться true. Если устройство еще не открыто, ваш openDevice() функция должна установить соединение с устройством с помощью вызовов SDK устройства.

  2. Запустите поток сбора. Для получения дополнительной информации см. раздел «Запуск потока сбора».

    Примечание

    Запуск отдельного потока требуется только, если ваш адаптер использует проект на основе потоков. Адаптеры также могут использовать асинхронные прерывания (коллбэки) для получения систем координат, если устройство поддерживает это. В этом сценарии адаптеры получают уведомление асинхронно, когда данные доступны. Для получения информации об использовании этого метода см. документацию по 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.

Параметр

Описание

lpStartAddress

Адрес процедуры получения потока. Укажите имя процедуры потока, объявленной в файле заголовка класса адаптера. См. «Реализация функции потока сбора».

lpParameter

Указатель на сам объект, т.е. this указатель.

lpThreadId

Адрес переменной, в которой CreateThread() функция возвращает идентификатор, назначенный только что созданному потоку

После вызова CreateThread() function, приложения обычно вызывают PostThreadMessage() функция для отправки сообщения новому потоку. Это заставляет систему создавать очередь сообщений для потока. Введите цикл, чтобы дождаться, пока поток подтвердит, что сообщение было получено, чтобы убедиться, что очередь потоков создана. Адаптер завершает поток в closeDevice() адаптера function - см. Предлагаемый алгоритм для closeDevice ().

Пример: Открытие соединения

Этот пример показывает скелетную реализацию openDevice() функция.

  1. Замените заглушку реализации 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;
    }
    
  2. Чтобы иметь возможность компилировать и связать ваш адаптер, вы должны создать заглушку реализации вашего 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
    
  3. Добавьте объявления 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;
    
  4. Скомпилируйте и соедините адаптер. Вы должны иметь возможность создать объект входа видео. Когда вы вызываете start проверьте, что адаптер успешно создал поток сбора.

Предложенный алгоритм для closeDevice ()

The closeDevice() функция обычно выполняет следующие задачи.

  1. Проверьте, закрыто ли устройство. Если это так, выход.

  2. Отправьте сообщение в поток сбора, чтобы выйти и подождать, пока он вернется до выхода, для адаптеров с проектами на основе потоков. Дополнительные сведения о размещении сообщения в потоке см. в разделе Отправка сообщения в поток сбора.

  3. Закройте указатель, сопоставленный с установочной резьбой, и сбросьте переменную указателя на 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;
}
Для просмотра документации необходимо авторизоваться на сайте