В этом разделе описывается использовать критические разделы, чтобы защитить фрагменты вашего кода адаптера. Раздел описывает основной критический класс раздела набора адаптера, ICriticalSection
, и вспомогательный класс, IAutoCriticalSection
, то, что вы используете, чтобы управлять критическими разделами. Затронутые темы включают
Чтобы препятствовать тому, чтобы разделы кода или ресурсов были получены доступ одновременно несколькими потоками, используйте критический раздел (ICriticalSecton
Объекты. Базовый процесс для использования критического раздела имеет три шага:
Создайте критический объект раздела, с помощью набора адаптера createCriticalSection()
функция.
В точке в вашем коде, что вы хотите защитить, введите критический раздел путем вызова ICriticalSection::enter()
функция членства.
В конце кода, который вы хотите защитить, оставьте критический раздел путем вызова ICriticalSection::leave()
функция членства.
В то время как этот процесс может казаться простым, с помощью ICriticalSection
возразите непосредственно таким образом может подвергнуть ваш адаптер проблемам. Например, если ошибка происходит в защищенном коде, вызове leave()
функциональная сила никогда не быть выполненным. Ввод критического раздела и затем никогда отъезд его могут вызвать неожиданные результаты.
Чтобы сделать работу с критическими разделами легче, набор адаптера обеспечивает второй класс, названный IAutoCriticalSection
, это может помочь вам управлять критическими разделами, которые вы задаете.
Вы сначала создаете ICriticalSection
возразите и затем передайте этот объект createAutoCriticalSection()
функционируйте, когда вы создадите IAutoCriticalSection
объект. Когда вы создаете объект, вы автоматически вводите критический раздел, не имея необходимость вызывать enter()
функция. Когда защищенный код выходит из осциллографа, автоматический критический раздел автоматически оставляет критический раздел без вашего кода, имеющего необходимость вызывать leave()
функция.
Автоматический критический объект раздела гарантирует, что вы всегда выходите из критического раздела. Однако необходимо также гарантировать, что сам автоматический критический раздел удален. Для этого набор адаптера рекомендует управлению указатель на IAutoCriticalSection
объект, возвращенный createAutoCriticalSection()
, как auto_ptr
использование std::auto_ptr<>
шаблонный класс от Стандартной библиотеки шаблонов. auto_ptr
помогает гарантировать что IAutoCriticalSection
указатель удален.
Чтобы задать раздел кода как критический раздел, выполните эту процедуру.
Создайте ICriticalSection
объект, с помощью createCriticalSection()
функция. Адаптеры обычно создают ICriticalSection
объект в их конструкторах — видит Реализацию Вашего Конструктора класса Адаптера.
_mySection = imaqkit::createCriticalSection();
Функция возвращает указатель на ICriticalSection
объект. _mySection
, который объявляется как переменная члена в заголовочном файле класса адаптера, можно следующим образом.
imaqkit::ICriticalSection* _mySection;
В точке в вашем коде, что вы хотите защитить, создайте IAutoCriticalSection
объект. IAutoCriticalSection
класс гарантирует, что критические объекты раздела выпущены, когда защищенный код выходит из осциллографа, или если исключение происходит. В адаптере вы обычно хотите защитить цикл захвата системы координат в критическом разделе. Введите этот код в функции потока захвата, непосредственно перед тем, как цикл захвата системы координат — видит Реализацию Функции Потока Захвата.
std::auto_ptr<imaqkit::IAutoCriticalSection> myAutoSection(imaqkit::createAutoCriticalSection(adaptor->_mySection, true));
В этом коде, переменной myAutoSection
указатель на IAutoCriticalSection
объект, который управляем как Стандартная библиотека шаблонов auto_ptr
. Код передает указатель на ICriticalSection
объект, _mySection
, в качестве аргумента к createAutoCriticalSection()
функция. Второй аргумент к createAutoCriticalSection()
указывает, что адаптер должен ввести критический раздел автоматически по созданию IAutoCriticalSection
.
В конце кода, который вы хотите защитить, оставьте критический раздел. В адаптере вы хотите оставить критический раздел после того, как цикл захвата системы координат будет сделан. Введите этот код непосредственно перед тем, как функция потока захвата убегает из цикла захвата системы координат — смотрите Реализацию Функции Потока Захвата.
Можно использовать 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; }