C面向对象: 升级版本实现:同步逻辑、少量连续失败则增补、多次连续失败则拉长同步周期

// C语言之 面向对象+虚事务的抽象

/*********** 进阶练习: (对虚的事物的抽象) 完善部门职责 ***********************/

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned char mybool;

/*** 时间同步正常:每五分钟(300秒)同步一次
时间同步失败 :增补同步(在临近的60秒内wakeup无线模块增补一次同步)/节能处理(由300秒一次改为1小时一次) 机制
要求:如果曾经只要收到过一次同步信号,那么要保证之后每次唤醒的时间点都是预设的时间点。这个时间点需要是固定的。
***/

typedef enum{
ID1 = 1,
ID2,
ID3,
ID4,
ID5,
ID6
}ID_Enum;

typedef enum{
SyncProcessDepartment = 1,      // 时间同步处理 部
MarketDepartment,                      // 市场 部 : 这里可根据需求、自行扩展
HumanResourcesDepartment     // 人力资源 部
}Department_Enum;

typedef struct ClassInfo_{
ID_Enum ID;
Department_Enum Department;
}ClassInfo;

typedef enum SYNC_State__{
SYNC_NewOnceStart = 0,
SYNC_LastOnceOK = 0xff
}SYNC_State_;

enum SYNC_State__;
typedef struct Class_SYNC_Department_{
enum SYNC_State__ SYNC_State;       // 当前的同步状态
u16 SYNC_NormalPeriod;                     // 正常同步一次的周期
u8 SYNC_SomeTime;                           // 给点余量.本机提前5秒唤醒,(而不是刚好是在同步信号来的时刻才唤醒)以便去接收这个同步信号
u16 SYNC_ErrPeriod;

void (*pSYNC_Department_GetPara)(struct ClassAdmin_ *pthis, void* pSYNC_NormalPeriod, void* pSYNC_SomeReadyTime, void* pSYNC_ErrPeriod);
mybool(*pSYNC_Department_NormalProcess_CyeleCheck)(struct ClassAdmin_ *pthis);
void (*pSYNC_ERRProcess_CyeleCheck)(struct ClassAdmin_ *pthis, void* pFailTimes);
void (*pSYNCProcess_CyeleCheck) (struct ClassAdmin_ *pthis, SYNC_State_ SYNC_State);
}Class_SYNC_Department;

struct ClassAdmin_; 
typedef struct ClassAdmin_
{
ClassInfo  Internal_AdminInfo; //父类1

void(*pAdminInit)(struct ClassAdmin_ *pthis, ID_Enum Admin_ID, Department_Enum Admin_Department);

void* pInternal_AdminDepartment;

// 部门本职工作
void (*pAdminMustMainJob_GetPara)(struct ClassAdmin_ *pthis, void* Para1, void* Para2, void* Para3);

// 每个管理员自己的私活 : XX部门的YY,下班后送外卖挣了100元。
void (*pAdmin_PrivateJob1) (struct ClassAdmin_ *pthis, void* Para1);        
}ClassAdmin;

// 下面写 时间同步失败节能处理机制 的功能实现

// 具体的职能需要亲自操刀。我现在,需要一个时间同步的管理员。
// 那么我就来描述一下这个时间同步管理员的职责

// 首先是获取用户参数
void JobSYNC_Department_GetPara(struct ClassAdmin_ *pthis, void* pSYNC_NormalPeriod, void* pSYNC_SomeReadyTime, void* pSYNC_ErrPeriod)
{
u16 SYNC_NormalPeriod = *((u16*)pSYNC_NormalPeriod);
u8 SYNC_SomeReadyTime = *((u8*)pSYNC_SomeReadyTime);
u16 SYNC_ErrPeriod = *((u16*)pSYNC_ErrPeriod);

((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_NormalPeriod = SYNC_NormalPeriod;
((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_SomeTime = SYNC_SomeReadyTime;
((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_ErrPeriod = SYNC_ErrPeriod;
}

// 轮询方式: 每次同步后会传递过来SYNC_OK标志。
mybool JobSYNC_NormalProcess_CyeleCheck(struct ClassAdmin_ *pthis)
{
// 正常模式: 每次收到SYNC_State = SYNC_OK的时候,开始计时。计时到,300-13的时候,无线模块WAKEUP,等待同步信号。
static u8 SYNC_State = (u8)SYNC_NewOnceStart;
static u16 TimeCountdownforNextSYNCSingal = 0; // ????????????????????

static u32 ErrCnt = 0; // 异常计数器。
mybool Cur_retVal = 0; // 只关注最近的一次同步状态 0:正常 1:异常

ErrCnt++;

SYNC_State = ((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_State;

if(SYNC_State == (u8)SYNC_LastOnceOK) // 收到信号的时候,相当于打开一个秒表开始倒计时
{                                                                     // 对比生活里跑步比赛,枪声一响,教练会按下秒表。这个按下动作,就是打开秒表这一动作。
  SYNC_State = SYNC_NewOnceStart;         // 小结:要想利用生活的思维来指导编程,就不要遗漏生活里事物的细节,要严谨细致地观察,并一一映射到                                                                        // 编程思维。
  TimeCountdownforNextSYNCSingal = ((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_NormalPeriod;

  ErrCnt = 0; 
}
if(SYNC_State == (u8)SYNC_NewOnceStart)
{
  if(TimeCountdownforNextSYNCSingal>0)    // 这个是倒计时秒表的开关
  {
  if(--TimeCountdownforNextSYNCSingal == ((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_SomeTime)
    {
    // WirelessWakeUp(62);
    printf(" Wireless Wakeup, Ready to SYNC\n");
    TimeCountdownforNextSYNCSingal = 0;
    }
}
}

// 上面是正常周期性同步逻辑(周期性同步也会消除异常) 下面是发送异常消息

if(ErrCnt > ((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->SYNC_NormalPeriod)
{
  Cur_retVal = 1;                                   // 只关注最近的一次同步状态 0:正常 1:异常
}

return Cur_retVal;
}

void JobSYNC_ERRProcess_CyeleCheck(struct ClassAdmin_ *pthis, void* pFailTimes)
{
//异常分为:同步失败次数小于3 和 大于3的场景
u16 SYNC_NormalPeriod = ((Class_SYNC_Department*)pthis->pInternal_AdminDepartment)->SYNC_NormalPeriod;
u8 SYNC_SomeReadyTime = ((Class_SYNC_Department*)pthis->pInternal_AdminDepartment)->SYNC_SomeTime;
u8 FailTimes = *((u8*)pFailTimes);

if(FailTimes == 0)
  return ;             // 大于0才继续向下

if(FailTimes <= 3)
{
static u16 CntDown = 60;

  if(CntDown-- == SYNC_SomeReadyTime)
  {
  // WakeUp(62);
  printf("Wakeup in %d S later \n", CntDown);

  CntDown = SYNC_SomeReadyTime + 60;             // 这个SYNC_SomeReadyTime,让本周期的时间走完。
  }
}
else if(FailTimes <= 15)
{
static u16 CntDown = 3600;

  if(CntDown-- == SYNC_SomeReadyTime)
  {
  // WakeUp(62);
  printf("Wakeup in %d S later \n", CntDown);

  CntDown = SYNC_SomeReadyTime + 3600;
  }
}
if(FailTimes > 15)
  FailTimes = 0;
}

// 这里内部统一处理正常模式和异常模式
// 给外界提供友好的简单接口,而不需要外界来操作同步逻辑
void JobSYNCProcess_CyeleCheck(struct ClassAdmin_ *pthis, SYNC_State_ SYNC_State)
{
static u32 Failtimes = 0;
u16 SYNC_NormalPeriod = ((Class_SYNC_Department*)pthis->pInternal_AdminDepartment)->SYNC_NormalPeriod;

  if( 1 == (((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->pSYNC_Department_NormalProcess_CyeleCheck)(pthis))
  {
  Failtimes++;
  Failtimes = (Failtimes + SYNC_NormalPeriod)/ SYNC_NormalPeriod;
  // 如果这里超时会怎样?那就是超时的那会多唤醒了(SYNC_NormalPeriod-SYNC_SomeReadyTime)秒咯。
  //调用异常处理
  ((Class_SYNC_Department*)(pthis->pInternal_AdminDepartment))->pSYNC_ERRProcess_CyeleCheck(pthis, (void*)&Failtimes);
  }
  else
  {
  Failtimes = 0;
  }
}

void Obj_AdminInit(struct ClassAdmin_ *pthis, ID_Enum Admin_ID, Department_Enum Admin_Department)
{
pthis->Internal_AdminInfo.ID = Admin_ID;
pthis->Internal_AdminInfo.Department = Admin_Department;
}

// 例如: 创建一个同步部门的管理员Jason
ClassAdmin* pNewObj_ClassAdmin(ID_Enum Admin_ID, Department_Enum Admin_Department)
{
ClassAdmin* pNewObj_ClassAdmin = (ClassAdmin*)malloc(sizeof(ClassAdmin));

  if((ClassAdmin*)0 == pNewObj_ClassAdmin)
  pNewObj_ClassAdmin = (ClassAdmin*)malloc(sizeof(ClassAdmin));

  memset(pNewObj_ClassAdmin, 0, sizeof(ClassAdmin));

  pNewObj_ClassAdmin->pAdminInit = Obj_AdminInit;
  pNewObj_ClassAdmin->pAdminInit(pNewObj_ClassAdmin, Admin_ID, Admin_Department);

  return pNewObj_ClassAdmin;
}

// 如果初始化的是时间同步管理员,那么后三个参数输入,从左到右依次是:SYNC_NormalPeriod、SYNC_SomeReadyTime、SYNC_ErrPeriod
void InitNewObj_ClassAdmin(ClassAdmin* pAdmin, void* Para1, void* Para2, void* Para3)
{
// 初始化部门职责:传入参数
  if(pAdmin->Internal_AdminInfo.Department == SyncProcessDepartment) // 根据Department信息访问相应的父类
  {
  pAdmin->pAdminMustMainJob_GetPara = ((Class_SYNC_Department*)(pAdmin->pInternal_AdminDepartment))->pSYNC_Department_GetPara;
  ((Class_SYNC_Department*)(pAdmin->pInternal_AdminDepartment))->pSYNC_Department_NormalProcess_CyeleCheck =           JobSYNC_NormalProcess_CyeleCheck;
  ((Class_SYNC_Department*)(pAdmin->pInternal_AdminDepartment))->pSYNC_ERRProcess_CyeleCheck = JobSYNC_ERRProcess_CyeleCheck;
  ((Class_SYNC_Department*)(pAdmin->pInternal_AdminDepartment))->pSYNCProcess_CyeleCheck = JobSYNCProcess_CyeleCheck;
  }

  pAdmin->pAdminMustMainJob_GetPara(pAdmin, Para1, Para2, Para3);
}

int main(void)
{
  printf(" Hello \n");

// 使用方法 我没写,这套代码还没在实际的板子上跑过,是我重构的。
}

包括同步相关的那些逻辑,现在也用另一种思想修改过了。

思路清晰:  正常模式(包含异常检测), 发送异常通知,  异常处理。   这个思路是万能的。可复用的。

原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/10350420.html

时间: 2024-10-11 07:19:24

C面向对象: 升级版本实现:同步逻辑、少量连续失败则增补、多次连续失败则拉长同步周期的相关文章

Python升级版本及版本升级后Yum无法使用的解决方法

#升级版本 yum -y install gcc cd /opt wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz tar xf Python-2.7.6.tgz  ./configure --prefix=/usr/local/python2.7  cd Python-2.7.6 ./configure --prefix=/usr/local/python2.7  make && make install mv /usr/b

NTFS For Mac升级版本方法介绍

在苹果市场发展快速的今天,Mac电脑在我们日常办公中必不可少,但是我们再使用Mac电脑时常出现与Windows系统文件不兼容的问题.这时NTFS For Mac就派上用场了. NTFS For Mac在Windows系统和Mac系统之间提供无阻碍的数据交换.现在它已经升级到NTFS For Mac12了,如何升级NTFS For Mac版本呢? 小编在这里告诉大家升级版本操作起来很简单,NTFS For Mac官网会不定期的推出新版本,系统会自动检查是否有新版本推出.如果一个新版本的驱动程序已被

斗地主牌型基本算法升级版本

斗地主牌型基本算法升级版本 好久没更新博客了,前段时间和朋友一起开了一个公司 做APP,最后失败了.现在又开始做棋牌游戏了,最近在看网狐的源码,发现里面斗地主的基本算法太强大了,现在想想我原来的算法简直是弱爆了,分享一下 希望能对你有一点点帮助.以下主要涉及到判断牌型,牌型大小比较2块,如果你想了解更多关于棋牌游戏的东西请访问我的 棋牌游戏专栏. 一.判断牌型 定义一个结构来表示每张相同牌的信息. //分析结构 structtagAnalyseResult { BYTE cbFourCount;

Nginx 升级版本或者重新编译增加参数

Nginx 升级版本或者重新编译增加参数 这里我们重新编译下,增加nginx用户和组 先创建用户 #useradd nginx 开始编译 #cd /usr/local/nginx-1.6.1 #./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --h

中国寒龙社工包v3.34 6.1升级版本已经发布 具体请到官网下载!!感谢支持!~~~~~不会升级的请到咱们交流群!本程序在windowsxp下最为兼容 感谢支持!如果有BUG请反馈!!

寒龙社会工程包:http://pan.baidu.com/s/1dDcilBb当你看到 中国寒龙V3.34 6.1版本的发布  那么本工具包将更强大的 展现了工具包的价值! 本次开发由by:寒龙升级  感谢大家支持 如果有各位小组的支持 本人不谢感激! 当然本站内的工具包 可以提供专门店小组工具包 制作!承接QQ群:94588528 本次手动升级  修复一下几点的不足! v3.33版本出现的  各种打不开的问题 v3.33版本中出现 主程序远控不能配置的问题 v3.33版本 部分 文件夹不能打开

SQLSERVER 升级版本的方法

1. 以SQLSERVER2014为例说明 SQLSERVER升级版本的方法, 也适用于evaluation 版本超过180天之后的处理. 2. 打开所有的应用 看到有一个 sqlserver2008的安装中心 还有一个 sqlserver 2014 的安装中心 这里显然 选择 sqlserver2014 的安装中心.(虽然是废话 但是我自己也点错过) 3. 选择维护  然后选择版本升级 稍等片刻 4.输入产品密钥 如果您是盗版受害者 可以输入一些序列号,这里随便从网上搜了一下: SQL SER

CentOS7升级版本

一.挂载本地yum源 1.将光盘中的内容scp到本地目录下,这里我的目录是/home/sda5/cdrom 2.修改配置文件,将本地源指向拷贝的目录 cd /etc/yum.repos.d/ mkdir -p /etc/yum.repos.d/backup mv * /etc/yum.repos.d/backup #将其他的yum源移到备份目录下,防止冲突 vim /etc/yum.repos.d/local.repo 1 [local] 2 name=local 3 baseurl=file:

使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步

将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1.比对并同步数据库中的所有对象 包括存储过程.关系.表.视图和用户定义的函数 2.报告所有差异 3.生成直接在目标数据库上运行的迁移脚本 Red gate sql compare 官网:http://www.red-gate.com/products/sql-development/sql-compa

python 2.6.6升级版本的详细操作步骤!

python2.6.6升级2.7.x 1.下载python2.7.x wget https://www.python.org/ftp/python/2.7.x/Python-2.7.x.tgz 2.解压并编译安装 tar -zxvf Python-2.7.x.tgz && cd Python-2.7.x && ./configure && make all && make install && make clean  &