C语言工作笔记-函数指针的使用(补充C回调系统)

388 篇文章 20 订阅

本篇博文是基于:

https://blog.csdn.net/qq78442761/article/details/89202337

这篇博文的代码!

 

这里主要是做两个补充!

1. 模块一想加入一个处理,输出I am fine, fuck you1!

2. 只执行write模块!

 

这里修改上次的代码!

程序运行截图如下:

程序结构如下:

源码如下:

FirstModule.h

#pragma once
#include "stdef.h"
#include "moduleAdmin.h"

int InitFirstModule();

moduleAdmin.h

#pragma once

#include "stdef.h"

typedef enum tagMODULE_SETS	//SETS表示这是枚举集合
{
	MY_ALL_MODULE = 0,
	MY_READ_MODULE = 1,
	MY_WRITE_MODULE = 2,

	MY_INVALID_MODULE = 0xffff

}MODULE_SETS_E;	//E表示enum

typedef int(*pProcFun)();

typedef struct tagMoudleData	//一般带有管理的结构体在C语言中都是tagXXXX
{
	int iModule;		//每个模块唯一ID
	pProcFun pFun;
}MOUDLE_DATA_S;		//一般在结构体结尾都加S,代表struct;


int RegisterProc(int iModule, pProcFun pFun);
int ExcuteAllModule();
int ExcuteWriteModule();

SecondModule.h

#pragma once

#include "stdef.h"
#include "moduleAdmin.h"

int InitSecondModule();

stdef.h

#pragma once

#include <stdio.h>
#include <Windows.h>

#define OK 0
#define ERR -1

FirstModule.cpp

#include "FirstModule.h"

//模块一想加一个处理,输出I am fine, fuck you!

int iFlag = 2;

int FirstModuleEx(){
	
	printf("I am fine, fuck you!\n");
	return OK;
}


int FirstModuleProc(){

	printf("Hello I am First Module\n");
	if(iFlag <= 0){
		
		FirstModuleEx();
	}
	iFlag--;
	return OK;
}

int InitFirstModule(){

	RegisterProc(MY_WRITE_MODULE, FirstModuleProc);
	return OK;
}

main.cpp

#include "stdef.h"
#include "FirstModule.h"
#include "SecondModule.h"

DWORD WINAPI MyThread(){

	while(1){
		printf(">");
		ExcuteAllModule();
		Sleep(1000);
	}
}

DWORD WINAPI MyThreadEx(){
	
	while(1){
		printf("#");
		ExcuteWriteModule();
		Sleep(1000);
	}
}

int TestFunPtr(){

	InitFirstModule();

	HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThread, NULL, 0, NULL);
	HANDLE hThreadEx = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadEx, NULL, 0, NULL);

	Sleep(3000);
	InitSecondModule();
	Sleep(3000);

	TerminateThread(hThread, 0);
	CloseHandle(hThread);

	TerminateThread(hThreadEx, 0);
	CloseHandle(hThreadEx);

	return OK;
}

int main(int argc, int *argv[]){

	TestFunPtr();

	getchar();
	return 0;
}

moduleAdmin.cpp

#include "moduleAdmin.h"

#define MAX_PROC 100

int g_iProCnt = 0;	//全局的前面加一个g
MOUDLE_DATA_S FunList[MAX_PROC] = {0};

int RegisterProc(int iModule, pProcFun pFun){

	if(g_iProCnt == MAX_PROC){
		
		return ERR;
	}

	FunList[g_iProCnt].iModule = iModule;
	FunList[g_iProCnt].pFun = pFun;

	g_iProCnt++;
	return OK;
}

//调用注册的函数
int ExcuteAllModule(){

	for(int i = 0; i < g_iProCnt; i++){
		
		FunList[i].pFun();
	}

	return OK;
}

//只运行写模块
int ExcuteWriteModule(){
	
	for(int i = 0; i < g_iProCnt; i++){
	
		if(FunList[i].iModule == MY_WRITE_MODULE){
			
			FunList[i].pFun();
		}
	}

	return OK;
}

SecondModule.cpp

#include "SecondModule.h"

int SecondModuleProc(){

	printf("Hello I am Second Module\n");
	return OK;
}

int InitSecondModule(){

	RegisterProc(MY_READ_MODULE, SecondModuleProc);
	return OK;
}

源码打包下载地址:

https://github.com/fengfanchen/CAndCPP/tree/master/CfunctionPtrAndCallBack%20supplement

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值