————————————————————————————————————————————————————————————————————————————————————————
说来话长 , 但是总归与一点:
纸上得来终觉浅,绝知此事要躬行。
这个是任务链表,就是将要做的事情做成链表的样子。
一串一串的任务直接上!!!
首先是 .c文件
/*
*/
#include "taskChainSetup.h"
#include <stdio.h>
/*
* @brief 不等长不释放链表的创建
* @param none
*/
taskChainHead * createTaskHead(void)
{
taskChainHead *taskHead; //
taskHead = (taskChainHead *)malloc(sizeof(taskChainHead));
if (taskHead == NULL)
{
return NULL;
}
taskHead->count = 0;
taskHead->currentPointer = NULL;
taskHead->headPointer = NULL;
}
/*对任务连做插入操作*/
bool insertTaskBody(taskChainHead *taskHead , bool(*actionFunc)(void) )
{
taskChainBody *Bodytemp; //临时用于中间转化的变量
taskChainBody *BodyNew; //用于接收新创建的节点
Bodytemp = taskHead->headPointer;
if (Bodytemp == NULL) //证明这个队列目前是空的
{
BodyNew = (taskChainBody *)malloc(sizeof(taskChainBody));
if (BodyNew == NULL)
{
return false;
}
BodyNew->atomicAction = actionFunc;
BodyNew->Next = NULL;
taskHead->count++;
taskHead->currentPointer = BodyNew;
taskHead->headPointer = BodyNew;
}
else //这个队列目前不空
{
while (1)
{
if (Bodytemp->Next == NULL)
{
BodyNew = (taskChainBody*)malloc(sizeof(taskChainBody));
if (BodyNew == NULL) return false;
BodyNew->atomicAction = actionFunc;
BodyNew->Next = NULL;
Bodytemp->Next = BodyNew;
taskHead->count++;
break;
}
else
{
Bodytemp = Bodytemp->Next;
}
}
return true;
}
}
/*处理任务链*/
bool executionTaskChain(taskChainHead* taskHead)
{
if (taskHead->currentPointer == NULL)
{
return false;
}
if (taskHead->currentPointer->atomicAction())
{
if (taskHead->currentPointer->Next == NULL)
{
taskHead->currentPointer = taskHead->headPointer;
return true;
}
else
{
taskHead->currentPointer = taskHead->currentPointer->Next;
}
}
return false;
}
void func_test1()
{
for (int i = 0; i < 100; i++)
{
printf("chenxu ");
}
printf("\r\n");
}
void func_test2()
{
for (int i = 0; i < 100; i++)
{
printf("asdfghjkl ");
}
printf("\r\n");
}
void func_test3()
{
for (int i = 0; i < 100; i++)
{
printf("qwertyuiop ");
}
printf("\r\n");
}
int main()
{
taskChainHead* chenxu_test;
chenxu_test = createTaskHead();
insertTaskBody(chenxu_test, func_test1);
insertTaskBody(chenxu_test, func_test2);
insertTaskBody(chenxu_test, func_test3);
while (1)
{
if (executionTaskChain(chenxu_test) == true)
{
break;
}
printf("123456789\r\n");
}
while (1)
{
;
}
}
下面是 .h文件
/*
*/
#ifndef TASKCHAINSETUP
#define TASKCHAINSETUP
#include "stdlib.h"
#include "stdbool.h"
/* 任务体结构 */
typedef struct taskChainBodyobj
{
bool(*atomicAction)(void); //任务链中的一个节点的原子操作函数
struct taskChainBodyobj *Next; //任务链中节点的下一个节点。
}taskChainBody;
/* 链表的任务头结构 */
typedef struct taskChainHeadObj
{
int count; //任务链条的当前长度
taskChainBody * currentPointer; //保存任务链的当前指针
taskChainBody * headPointer; //保存任务链头指针 ,(指向下一个任务链的指针)
}taskChainHead;
#endif