Обратные вызовы в C++ | страница 97
2. Для обработки ошибок в исходной реализации мы использовали исключения. Как сейчас обрабатывать ошибки, ведь в интерфейсах API исключения недопустимы?
3. В исходной реализации мы в каждом потоке могли объявить отдельный интерфейсный класс и работать с ним независимо от остальных потоков. Как теперь обеспечить многопоточную работу, ведь отдельные потоки вызывают одни и те же интерфейсные функции?
4. В исходной реализации драйвер настраивался путем создания нового класса и передаче его в интерфейсный класс. Как теперь настраивать драйвер, если в интерфейсах API нельзя использовать классы?
5. Как организовать обратные вызовы?
Рассмотрим, как эти проблемы можно решить.
6.3.2. Объявления типов
В исходной реализации общие типы объявлены в SensorDef.h, но мы не можем просто перенести их в интерфейс API из-за использования специфических конструкций С++. Поэтому нам придется повторить эти объявления в стиле C с использованием простых типов, которые можно будет использовать в интерфейсных функциях. Объявления представлены в Листинг 103.
>#ifdef _WINDOWS // (1)
> #ifdef LIB_EXPORTS
> #define LIB_API __declspec(dllexport)
> #else
> #define LIB_API __declspec(dllimport)
> #endif
> #else
> #define LIB_API
>#endif
>typedef uint32_t SensorNumber; // (2)
>typedef double SensorValue; // (3)
>typedef uint32_t CheckAlertTimeout; // (4)
>typedef uint32_t SensorType; // (5)
>typedef uint32_t DriverType; // (6)
>typedef uint32_t AlertRule; // (7)
>typedef void(*SensorValueCallback)(SensorNumber, SensorValue, void*); // (8)
>typedef CheckAlertTimeout(*SensorAlertCallback)(SensorNumber, SensorValue, void*); // (9)
>typedef SensorValue(*OnSimulateReadValue)(SensorNumber, int, void*); // (10)
>typedef int (*OnSimulateOperable)(SensorNumber, void*); // (11)
>enum eSensorType // (12)
>{
> SENSOR_SPOT = 0,
> SENSOR_SMOOTH = 1,
> SENSOR_DERIVATIVE = 2,
>};
>enum eDriverType // (13)
>{
> DRIVER_SIMULATION = 0,
> DRIVER_USB = 1,
> DRIVER_ETHERNET = 2
>};
>enum eAlertRule // (14)
>{
> ALERT_MORE = 0,
> ALERT_LESS = 1
>};
В строке 1 объявлены определения для экспортируемых функций. Эти объявления необходимы для компиляции динамической библиотеки в среде Windows, для других платформ они неактуальны.
В строках 2–4 объявлены типы, которые будут использоваться для входных параметров интерфейсных функций. Это те же объявления, которые использовались в исходной реализации (SensorDef.h, см. п. 6.2.2).