Используя критические разделы

В этом разделе описывается использовать критические разделы, чтобы защитить фрагменты вашего кода адаптера. Раздел описывает основной критический класс раздела набора адаптера, ICriticalSection, и вспомогательный класс, IAutoCriticalSection, то, что вы используете, чтобы управлять критическими разделами. Затронутые темы включают

Понимание критических разделов

Чтобы препятствовать тому, чтобы разделы кода или ресурсов были получены доступ одновременно несколькими потоками, используйте критический раздел (ICriticalSectonОбъекты. Базовый процесс для использования критического раздела имеет три шага:

  1. Создайте критический объект раздела, с помощью набора адаптера createCriticalSection() функция.

  2. В точке в вашем коде, что вы хотите защитить, введите критический раздел путем вызова ICriticalSection::enter() функция членства.

  3. В конце кода, который вы хотите защитить, оставьте критический раздел путем вызова ICriticalSection::leave() функция членства.

В то время как этот процесс может казаться простым, с помощью ICriticalSection возразите непосредственно таким образом может подвергнуть ваш адаптер проблемам. Например, если ошибка происходит в защищенном коде, вызове leave() функциональная сила никогда не быть выполненным. Ввод критического раздела и затем никогда отъезд его могут вызвать неожиданные результаты.

Чтобы сделать работу с критическими разделами легче, набор адаптера обеспечивает второй класс, названный IAutoCriticalSection, это может помочь вам управлять критическими разделами, которые вы задаете.

Вы сначала создаете ICriticalSection возразите и затем передайте этот объект createAutoCriticalSection() функционируйте, когда вы создадите IAutoCriticalSection объект. Когда вы создаете объект, вы автоматически вводите критический раздел, не имея необходимость вызывать enter() функция. Когда защищенный код выходит из осциллографа, автоматический критический раздел автоматически оставляет критический раздел без вашего кода, имеющего необходимость вызывать leave() функция.

Автоматический критический объект раздела гарантирует, что вы всегда выходите из критического раздела. Однако необходимо также гарантировать, что сам автоматический критический раздел удален. Для этого набор адаптера рекомендует управлению указатель на IAutoCriticalSection объект, возвращенный createAutoCriticalSection(), как auto_ptr использование std::auto_ptr<> шаблонный класс от Стандартной библиотеки шаблонов. auto_ptr помогает гарантировать что IAutoCriticalSection указатель удален.

Пример: Используя критический раздел

Чтобы задать раздел кода как критический раздел, выполните эту процедуру.

  1. Создайте ICriticalSection объект, с помощью createCriticalSection() функция. Адаптеры обычно создают ICriticalSection объект в их конструкторах — видит Реализацию Вашего Конструктора класса Адаптера.

    _mySection = imaqkit::createCriticalSection();
    

    Функция возвращает указатель на ICriticalSection объект. _mySection, который объявляется как переменная члена в заголовочном файле класса адаптера, можно следующим образом.

    imaqkit::ICriticalSection* _mySection;
    
  2. В точке в вашем коде, что вы хотите защитить, создайте IAutoCriticalSection объект. IAutoCriticalSection класс гарантирует, что критические объекты раздела выпущены, когда защищенный код выходит из осциллографа, или если исключение происходит. В адаптере вы обычно хотите защитить цикл захвата системы координат в критическом разделе. Введите этот код в функции потока захвата, непосредственно перед тем, как цикл захвата системы координат — видит Реализацию Функции Потока Захвата.

    std::auto_ptr<imaqkit::IAutoCriticalSection> 
    myAutoSection(imaqkit::createAutoCriticalSection(adaptor->_mySection, 
    true));
    

    В этом коде, переменной myAutoSection указатель на IAutoCriticalSection объект, который управляем как Стандартная библиотека шаблонов auto_ptr. Код передает указатель на ICriticalSection объект, _mySection, в качестве аргумента к createAutoCriticalSection() функция. Второй аргумент к createAutoCriticalSection() указывает, что адаптер должен ввести критический раздел автоматически по созданию IAutoCriticalSection.

  3. В конце кода, который вы хотите защитить, оставьте критический раздел. В адаптере вы хотите оставить критический раздел после того, как цикл захвата системы координат будет сделан. Введите этот код непосредственно перед тем, как функция потока захвата убегает из цикла захвата системы координат — смотрите Реализацию Функции Потока Захвата.

    Можно использовать IAutoCriticaSection::leave() функционируйте, но это не необходимо. IAutoCriticalSection оставляет критический раздел автоматически, когда секция кода выходит из осциллографа. Вы можете хотеть включать явные вызовы leave() функционируйте в своем коде, чтобы помочь зарегистрировать степень вашего критического раздела.

    bool MyDeviceAdaptor::stopCapture(){
    
    // If the device is not acquiring data, return. 
       if (!isAcquiring()) 
          return true;
    
    // Get the critical section and enter it.
    
       std::auto_ptr<imaqkit::IAutoCriticalSection> 
       GrabSection(imaqkit::createAutoCriticalSection(_grabSection,
                                                      true));
    
    //**********************************************************
    // Insert calls to your device's SDK to stop the device, if
    // necessary.
    //**********************************************************
    
    // Leave the critical section.
    
       GrabSection->leave();
    
       return true;
    }