Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Тема закрыта
|
||||
|
|
Ошибка при считывании данных с карты L791Доброго времени суток. Для чего используется EnterCriticalSection() ? и в каких случаях он может срабатывать? у меня в самом начале кода, где должно происходить считывание используется EnterCriticalSection(section_harvest), и при обращении к этому событию, вылетает ошибка "EAccesViolation" (вроде так). Но при этом считывание серийного номера и модели карты проходит без проблем. |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791Если за комментировать, то программа виснет. вот этот фрагмент: void __fastcall TForm1::Button1Click(TObject *Sender)
while(true)
//for (j=0;j<Sync[I_ADC_PCI_COUNT_L791];j++)
Label1->Caption = DI1; if (DI1!=DI_save)
} if (abs((GetTickCount()- StTick))!= 0) {
// if (StopThread_harvest) break;
|
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791кстати, вот эта строка: for (j=0;j<Sync[I_ADC_PCI_COUNT_L791];j++) тоже не работает, выдает ошибку. По этому временно за комментировал. |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791а что это за код вообще? У меня таких примеров нет... |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791это индивидуальный пример... программист до меня написал программу (давно еще), теперь мне нужно ее исправлять. Пытаюсь разобраться. если бесконечный цикл while убрать то вроде как работает все. Но с ним программа виснет. Но по смыслу он нужен. |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791Sync[I_ADC_PCI_COUNT_L791] это счетчик и если сбор активен, то я затрудняюсь сказать что будет... А так чтаются ттл линии. Критическая секция для экслюзивности доступа видимо.. |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791Спасибо. А на счет зависания в бесконечном цикле ? Суть в том что точно такой же цикл в оригинале, запускается в отдельном потоке, и все вроде бы работает. Я пытаюсь отдельно сделать пример где только этот цикл, запускается по нажатию кнопки. если делать ограниченное кол-во итераций, то сбор данных проходит нормально. Но мне нужно чтобы он работал постоянно, до момента пока не закрою программу, или не нажму Стоп. |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791решил проблему с зависанием, вместо бесконечного цикла поместил код в Timer. Только теперь вопрос, может ли это повлиять на точность сбора данных ? |
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791Критическая секция нужна для многопоточности, чтобы два потока не могли одновременно лезть в одни и те же данные (глобальные переменные, аппаратные ресурсы и т.д.). Ошибка у Вас возникала, очевидно, потому что критическая секция не была создана. Вероятно, в этой программе section_harvest - это указатель (CRITICAL_SECTION* section_harvest), который как-то передается в класс или создается в конструкторе. Так и сам указатель должен быть валидным, и переменная, на которую он ссылается, должна быть проинициализирована вызовом InitializeCriticalSection. Вообще шаблон использования критической секции примерно такой: /* глобальная переменная */
/* какие-то защищенные данные */
/* в основной программе до старта потоков, один раз */
/* в потоках, обращающихся к данным, защищенным критической секцией */
/* в основной программе после останова потоков, один раз */
КРИТИЧНО, что на каждый Enter должен быть Leave - например, if (error_occured) return 0 или исключение в C++ после EnterCriticalSection приведет к тому, что все остальные потоки зависнут в ожидании. Именно поэтому Ваш предшественник поместил Leave в блок finally. Альтернативный более красивый способ для C++ /*================================================================================================*
class TCSLock
|
|||
|
||||
|
|
Re: Ошибка при считывании данных с карты L791Александр Е, Спасибо!) Теперь все начинает вставать на свои места) |
|||
Страницы 1
Тема закрыта
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон:+7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск