Здравствуйте!
Есть софт для работы приборов ОВЕН посредством Owen_io.dll
Архитектура следующая:
1. "Своя" DLL, предоставляющая остальным частям софта доступ к owen_io.dll через функции-обертки.
2. Часть софта читающая приборы через "свою" DLL и визуализирующая результат.
Чтение в п.2 осуществляется циклически в потоке (Thread) по следующему алгоритму для каждого канала каждого прибора:
1. Открыли порт
2. Прочли нужный канал
3. Закрыли порт
4. Задержка (Sleep) для потока на 100мс.
Все работало стабильно и без сбоев.
Понадобилось добавить запись в приборы по требованию конечного пользователя из "визуализирующей" части.
Алгоритм:
1. В любой момент времени пользователь указывает, что и куда записать, нажимает кнопку в окне программы.
2. Через обертку в "своей" DLL вызывается соответствующая функция записи из owen_io.dll
Для синхронизации запросов на запись была ведена CriticalSection? т.о. алгоритм опроса стал:
1. Вошли в CriticalSection
2. Открыли порт
3. Прочли нужный канал
4. Закрыли порт
5. Вышли из CriticalSection
6. Задержка (Sleep) для потока на 100мс.
Соответственно, в момент записи:
1. EnterCriticalSection
2. WriteXXXX
3. LeaveCriticalSection
Теперь визуализирующая программа может только открывать и закрывать порт. На все другие операции (чтение/запись) возникает nErr с кодом "B", если конкретно: "Прибор вернул nErr: B"
Выходит, использование CriticalSection влияет на работоспособность owen_io.dll?
Если да, то как тогда лучше синхронизировать операции чтения записи?
PS: Используется OWENIO_API_NEW. При OWENIO_API_OLD библиотека работать отказывается. Среда Delphi XE2.