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

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

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

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


person hellowahab    schedule 31.08.2014    source источник


Ответы (1)


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

помогает.

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

SCardEstablishContext и SCardListReaders)

2) Начать опрос карты на каждом из ридеров из потока (используя API типа

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

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

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

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

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

person Vinayak Bhat    schedule 16.09.2014
comment
Как это лучше? Теперь у вас есть x потоков, выделенных для опроса, каждый из которых использует выделенный стек (занимает память), отдает что-то для обработки GC, потенциально вызывает переключение контекста, использует ЦП, потенциально отнимает ЦП от обработки, которая могла бы использовать его более эффективно, и т. д. Честно говоря, таймер звучит лучше. - person Peter Ritchie; 16.09.2014
comment
@PeterRitchie: Немного предыстории того, почему было использовано и предложено решение на основе потоков: - SCardGetStatusChange - это блокирующий вызов. мы можем настроить его таким образом, чтобы он возвращался только тогда, когда карта помещается в считывающее устройство. Таким образом, реальный опрос карты выполняется устройством чтения смарт-карт (имеющим микроконтроллер), а вызывающий поток бездействует. - person Vinayak Bhat; 16.09.2014