C 轻量级 信号与槽

C 轻量级 信号与槽

QT的信号与槽

一下是用C实现的简易的信号与槽。指针用的比较多。
废话不多说,上代码

#ifndef _SIMPLE_SIGNAL_SOLTS_H_
#define _SIMPLE_SIGNAL_SOLTS_H_
#include "string.h"

typedef void (*SIMPLE_SIGNAL)(void *signal, void *pArg);
typedef void (*SIMPLE_SOLTS) (void *pArg);

#define SIMPLE_SOLTS_T(FuncName)   void(FuncName)(void *pArg)

#define SIMPLE_EMIT(signal, arg)  if (signal != NULL)signal(&signal, arg)

#define SIMPLE_SIGNAL_SOLTS_MAX_SOLTS       10      //一个信号最多连接槽的数量
#define SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL      10      //信号最多数量


ErrorStatus SimpleSignalSolts_Connect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts);

#endif
/******************************************************************************
* @ File name --> SimpleSignalSolts.c
* @ Author    --> By@ LiuYu
* @ Version   --> V1.0
* @ Date      --> 2017 - 06 - 15
* @ Brief     --> 轻量级的信号与槽
* @           --> 一个信号对应多个槽,查表调用
*
* @ Copyright (C) 20**
* @ All rights reserved
*******************************************************************************
*
*                                  File Update
* @ Version   --> V1.0
* @ Author    --> 
* @ Date      --> 
* @ Revise    --> 
* @           --> 
*
*
******************************************************************************/
#include "SimpleSignalSolts.h"
#include <string.h>

//信号结构
typedef struct
{
    void            *signleID;    //信号的指针的指针,保存信号的指针,根据指针的地址确定是否是唯一
    SIMPLE_SOLTS    soltsTable[SIMPLE_SIGNAL_SOLTS_MAX_SOLTS];
    uint8_t         soltsCount;
}SIMPLE_SIGNAL_T;
//信号表结构
typedef struct
{
    SIMPLE_SIGNAL_T signalTable[SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL];
    uint8_t         signalCount;
}SIMPLE_SIGNAL_SOLTS_HANDLE_T;



SIMPLE_SIGNAL_SOLTS_HANDLE_T handle = 
{
    .signalCount = 0,
};


static void SimpleSignalSolts_Signal(void *signal, void *pArg)
{
    uint8_t i, j;
    SIMPLE_SOLTS solts;
    for (i = 0; i < handle.signalCount; i++) //查找是否是同一个信号
    {
        if (handle.signalTable[i].signleID == signal)  //这里注意,signleID保存的是指针的地址,
        {
            for (j = 0; j < handle.signalTable[i].soltsCount; j++)
            {
                 solts = handle.signalTable[i].soltsTable[j];
                 if (solts != NULL)
                 {
                     solts(pArg);
                 }
            }
        }
    }
}

/******************************************************************
  * @函数说明:   连接信号与槽
  * @输入参数:   SIMPLE_SIGNAL *singnal 信号的指针(指针的指针) 
                 SIMPLE_SOLTS solts     槽
  * @输出参数:   无
  * @返回参数:   ErrorStatus 
  * @修改记录:   ----
******************************************************************/
ErrorStatus SimpleSignalSolts_Connect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts)
{
    if (signal == NULL || solts == NULL)    //查空
    {
        return ERROR;
    }

    uint8_t i;

    if (handle.signalCount > SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL)    //错误
    {
        handle.signalCount = 0;
    }

    for (i = 0; i < handle.signalCount; i++) //查找是否是同一个信号
    {
        if (handle.signalTable[i].signleID == signal)  //这里注意,signleID保存的是指针的地址,
        {
            if (handle.signalTable[i].soltsCount > SIMPLE_SIGNAL_SOLTS_MAX_SOLTS)
            {
                handle.signalTable[i].soltsCount = 0;
            }

            if (handle.signalTable[i].soltsCount == SIMPLE_SIGNAL_SOLTS_MAX_SOLTS) //满了
            {
                return ERROR;
            }
            else
            {
                handle.signalTable[i].soltsTable[handle.signalTable[i].soltsCount++] = solts; //保存槽
                return SUCCESS; //结束
            }
        }
    }

    if (handle.signalCount == SIMPLE_SIGNAL_SOLTS_MAX_SIGNAL)   //满了
    {
        return ERROR;
    }
    else
    {
        handle.signalTable[handle.signalCount].signleID = signal; //保存新的信号
        handle.signalTable[handle.signalCount].soltsTable[0] = solts; //保存槽
        handle.signalTable[handle.signalCount++].soltsCount = 1;
        *signal = SimpleSignalSolts_Signal;
        return SUCCESS;
    }
}
/******************************************************************
  * @函数说明:   断开信号槽
  * @输入参数:   SIMPLE_SIGNAL *singnal 信号的指针(指针的指针) 
                 SIMPLE_SOLTS solts     槽
  * @输出参数:   无
  * @返回参数:   ErrorStatus 
  * @修改记录:   ----
******************************************************************/
ErrorStatus SimpleSignalSolts_Disconnect(SIMPLE_SIGNAL *signal, SIMPLE_SOLTS solts)
{
    if (signal == NULL || solts == NULL || handle.signalCount == 0)    //查空
    {
        return ERROR;
    }
    uint8_t i, j;

    for (i = 0; i < handle.signalCount; i++) //查找是否是同一个信号
    {
        if (handle.signalTable[i].signleID == signal)  //这里注意,signleID保存的是指针的地址,
        {
            for (j = 0; j < handle.signalTable[i].soltsCount; j++)
            {
                 if (handle.signalTable[i].soltsTable[j] == solts)  //找到槽  移除
                 {
                     memcpy(&handle.signalTable[i].soltsTable[j], &handle.signalTable[i].soltsTable[j +1], 
                                (handle.signalTable[i].soltsCount - j - 1) * sizeof(SIMPLE_SOLTS));
                     handle.signalTable[i].soltsCount--;
                 }
            }
            if (handle.signalTable[i].soltsCount == 0)  //此信号没有连接槽了
            {   
                memcpy(&handle.signalTable[i], &handle.signalTable[i + 1], (handle.signalCount - i - 1) * sizeof(SIMPLE_SIGNAL_T));
                handle.signalCount--;
            }
            return SUCCESS;
        }
    }
    return ERROR;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值