Как реализовать запуск по событиям вместо таймера

1

Недавно я реализовал связь с ACR122, используя библиотеку winscard. Я использовал таймер для вызова всех релевантных вызовов API, таких как 1. SCardEstablishContext 2. SCardListReaders и т.д., Чтобы получить статус читателя

Я сохранил интервал до пяти (5) секунд для таймера. Таким образом, вы получаете задержку в 5 секунд при получении статуса устройства.

Может ли кто-нибудь предложить мне лучший подход, например, "триггер, основанный на событиях", чтобы избежать этой задержки и удалить таймер.

Теги:
event-handling
smartcard
pcsc
acr122

1 ответ

0

Ниже приведен общий подход, который я выполнил в двух проектах, которые я реализовал. Надеюсь, это

помогает.

1) Инициализируйте все считыватели, подключенные к системе (используя apis like

SCardEstablishContext и SCardListReaders)

2) Начните опрос для карточки на каждом из читателей из потока (используя apis like

SCardGetStatusChange). У меня был бы один поток для каждого читателя. Когда считыватель обнаруживает карту

на нем возникает событие для совершения транзакций с карточками.

3) Обработайте событие, поднятое потоком опроса, чтобы совершать транзакции с картой (используя apis like

Используется SCardConnect SCardTransmit)

Я думаю, что вышеупомянутый подход поможет вам избавиться от таймеров и оптимизировать производительность.

  • 0
    Чем это лучше? Теперь у вас есть x потоков, выделенных для опроса, каждый из которых использует выделенный стек (занимая память), давая что-то для обработки GC, потенциально вызывая переключение контекста, используя CPU, потенциально отнимая CPU от обработки, что может использовать его более эффективно, и т. Д. Честно говоря, таймер звучит как лучшая идея.
  • 0
    @PeterRitchie: Немного предыстории о том, почему было использовано решение на основе потоков, и предложено: - SCardGetStatusChange - это блокирующий вызов. мы можем установить его таким образом, чтобы он возвращался только тогда, когда карта помещена в считыватель. Таким образом, реальный опрос для карты выполняется считывателем смарт-карт (который имеет микроконтроллер), и вызывающий поток находится в режиме ожидания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню