C语言实现简单任务管理器:任务调度与优先级管理的编程实践

 

引言

在现代操作系统和各类应用程序中,任务管理是保障系统高效运行的关键部分。通过任务管理器,能够合理安排不同任务的执行顺序、资源分配以及优先级调度。使用C语言开发简单任务管理器,不仅可以巩固结构体、链表等数据结构知识,还能深入理解任务调度和优先级管理的实现原理。本文将详细介绍如何利用C语言构建一个具备任务创建、删除、查看、优先级调整以及调度执行功能的简单任务管理器,并解析其核心代码逻辑。

一、系统功能需求分析

一个基础的简单任务管理器应具备以下核心功能:

1. 任务创建:允许用户创建新任务,输入任务名称、描述、执行时间和优先级等信息。

2. 任务查看:显示当前所有任务的详细信息,包括任务ID、名称、描述、执行时间和优先级。

3. 任务删除:可根据任务ID删除指定任务。

4. 优先级调整:能够修改任务的优先级,支持动态调整任务执行顺序。

5. 任务调度:按照任务优先级从高到低的顺序模拟任务执行过程。

6. 错误处理:对任务操作过程中出现的错误(如任务ID不存在等)进行合理提示 。

二、C语言实现简单任务管理器核心代码

2.1 定义数据结构与全局变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_TASKS 100  // 最大任务数量
int taskIdCounter = 1;  // 任务ID计数器,从1开始

// 定义任务结构体
typedef struct Task {
    int id;
    char name[50];
    char description[100];
    int executionTime;  // 任务执行时间
    int priority;  // 任务优先级,数值越大优先级越高
    struct Task *next;
} Task;

Task *tasks[MAX_TASKS];  // 任务数组,使用数组模拟简单链表头指针
代码解析

• 定义Task结构体,包含任务ID(id)、任务名称(name)、任务描述(description)、执行时间(executionTime)、优先级(priority)以及指向下一个任务节点的指针(next)。

• 使用tasks数组存储任务,数组元素为指向Task结构体的指针,可模拟简单链表头指针。

• taskIdCounter用于生成唯一的任务ID,初始值为1。

• MAX_TASKS定义了系统能够管理的最大任务数量。

2.2 任务创建函数
// 创建新任务
void createTask() {
    if (taskIdCounter > MAX_TASKS) {
        printf("已达到任务数量上限,无法创建新任务!\n");
        return;
    }
    Task *newTask = (Task *)malloc(sizeof(Task));
    newTask->id = taskIdCounter++;
    printf("请输入任务名称: ");
    scanf("%s", newTask->name);
    printf("请输入任务描述: ");
    scanf("%s", newTask->description);
    printf("请输入任务执行时间: ");
    scanf("%d", &newTask->executionTime);
    printf("请输入任务优先级: ");
    scanf("%d", &newTask->priority);
    newTask->next = NULL;

    // 根据优先级插入任务到合适位置
    int inserted = 0;
    for (int i = 0; i < MAX_TASKS; i++) {
        if (tasks[i] == NULL) {
            tasks[i] = newTask;
            inserted = 1;
            break;
        } else if (tasks[i]->priority < newTask->priority) {
            newTask->next = tasks[i];
            tasks[i] = newTask;
            inserted = 1;
            break;
        }
    }
    if (!inserted) {
        for (int i = 0; i < MAX_TASKS - 1; i++) {
            if (tasks[i]->priority >= newTask->priority && tasks[i + 1]->priority < newTask->priority) {
                newTask->next = tasks[i + 1];
                tasks[i]->next = newTask;
                break;
            }
        }
    }
    printf("任务创建成功!任务ID: %d\n", newTask->id);
}
代码解析

createTask函数用于创建新任务:

1. 检查任务数量是否达到上限,若达到则提示无法创建并返回。

2. 使用malloc分配内存创建新任务节点,获取用户输入的任务名称、描述、执行时间和优先级,并初始化节点指针。

3. 根据任务优先级将新任务插入到tasks数组或链表的合适位置。优先查找空位置插入;若位置已被占用,比较优先级插入到优先级较低的任务之前;若所有已有任务优先级都高于新任务,则插入到链表末尾合适位置。

4. 最后提示任务创建成功并显示任务ID。

2.3 任务查看函数
// 查看所有任务
void viewTasks() {
    printf("任务列表:\n");
    for (int i = 0; i < MAX_TASKS; i++) {
        if (tasks[i]!= NULL) {
            Task *temp = tasks[i];
            while (temp!= NULL) {
                printf("任务ID: %d\n", temp->id);
                printf("任务名称: %s\n", temp->name);
                printf("任务描述: %s\n", temp->description);
                printf("执行时间: %d\n", temp->executionTime);
                printf("优先级: %d\n", temp->priority);
                printf("-----------------\n");
                temp = temp->next;
            }
        }
    }
}
代码解析

viewTasks函数遍历tasks数组及其对应的链表,输出每个任务的详细信息,包括任务ID、名称、描述、执行时间和优先级,便于用户查看当前所有任务状态。

2.4 任务删除函数
// 删除任务
void deleteTask() {
    int taskId;
    printf("请输入要删除的任务ID: ");
    scanf("%d", &taskId);
    for (int i = 0; i < MAX_TASKS; i++) {
        if (tasks[i]!= NULL) {
            if (tasks[i]->id == taskId) {
                Task *temp = tasks[i];
                tasks[i] = tasks[i]->next;
                free(temp);
                printf("任务ID %d已成功删除!\n", taskId);
                return;
            }
            Task *prev = tasks[i];
            Task *curr = tasks[i]->next;
            while (curr!= NULL) {
                if (curr->id == taskId) {
                    prev->next = curr->next;
                    free(curr);
                    printf("任务ID %d已成功删除!\n", taskId);
                    return;
                }
                prev = curr;
                curr = curr->next;
            }
        }
    }
    printf("未找到任务ID为 %d 的任务!\n", taskId);
}
代码解析

deleteTask函数根据用户输入的任务ID删除任务:

1. 获取用户输入的任务ID。

2. 遍历tasks数组及其链表,查找匹配的任务ID。若在链表头找到,更新头指针并释放节点内存;若在链表中间或末尾找到,调整前一个节点的指针指向并释放目标节点内存。

3. 若未找到匹配的任务ID,则提示用户未找到该任务。

2.5 优先级调整函数
// 调整任务优先级
void adjustPriority() {
    int taskId, newPriority;
    printf("请输入要调整优先级的任务ID: ");
    scanf("%d", &taskId);
    printf("请输入新的优先级: ");
    scanf("%d", &newPriority);
    for (int i = 0; i < MAX_TASKS; i++) {
        if (tasks[i]!= NULL) {
            Task *temp = tasks[i];
            while (temp!= NULL) {
                if (temp->id == taskId) {
                    temp->priority = newPriority;
                    // 重新调整任务在链表中的位置
                    if (i > 0 && tasks[i - 1]!= NULL && tasks[i - 1]->priority < newPriority) {
                        Task *prevList = tasks[i - 1];
                        while (prevList->next!= NULL && prevList->next->priority >= newPriority) {
                            prevList = prevList->next;
                        }
                        Task *next = temp->next;
                        temp->next = prevList->next;
                        prevList->next = temp;
                        if (tasks[i]->next == temp) {
                            tasks[i]->next = next;
                        }
                    } else if (tasks[i + 1]!= NULL && tasks[i + 1]->priority > newPriority) {
                        Task *nextList = tasks[i + 1];
                        while (nextList->next!= NULL && nextList->next->priority <= newPriority) {
                            nextList = nextList->next;
                        }
                        Task *prev = temp->next;
                        temp->next = nextList->next;
                        nextList->next = temp;
                        if (tasks[i]->next == temp) {
                            tasks[i]->next = prev;
                        }
                    }
                    printf("任务ID %d的优先级已成功调整为 %d!\n", taskId, newPriority);
                    return;
                }
                temp = temp->next;
            }
        }
    }
    printf("未找到任务ID为 %d 的任务!\n", taskId);
}
代码解析

adjustPriority函数根据用户输入的任务ID和新优先级调整任务优先级:

1. 获取用户输入的任务ID和新优先级。

2. 遍历tasks数组及其链表,查找匹配的任务ID,更新任务的优先级。

3. 根据新优先级重新调整任务在链表中的位置,确保任务按照优先级从高到低的顺序排列 。

4. 若未找到匹配任务ID,则提示用户未找到该任务。

2.6 任务调度函数
// 任务调度
void scheduleTasks() {
    printf("开始任务调度:\n");
    for (int i = 0; i < MAX_TASKS; i++) {
        if (tasks[i]!= NULL) {
            Task *temp = tasks[i];
            while (temp!= NULL) {
                printf("执行任务ID: %d,任务名称: %s,执行时间: %d\n", 
                       temp->id, temp->name, temp->executionTime);
                temp = temp->next;
            }
        }
    }
    printf("任务调度完成!\n");
}
代码解析

scheduleTasks函数按照任务优先级从高到低的顺序,模拟任务执行过程,输出每个任务的ID、名称和执行时间,展示任务调度结果。

2.7 主函数与菜单设计
int main() {
    int choice;
    while (1) {
        printf("\n===== 简单任务管理器菜单 =====\n");
        printf("1. 创建任务\n");
        printf("2. 查看任务\n");
        printf("3. 删除任务\n");
        printf("4. 调整任务优先级\n");
        printf("5. 任务调度\n");
        printf("6. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                createTask();
                break;
            case 2:
                viewTasks();
                break;
            case 3:
                deleteTask();
                break;
            case 4:
                adjustPriority();
                break;
            case 5:
                scheduleTasks();
                break;
            case 6:
                printf("感谢使用,再见!\n");
                return 0;
            default:
                printf("无效的选择,请重新输入!\n");
        }
    }
    return 0;
}
代码解析

主函数通过一个无限循环展示操作菜单,用户输入选择后,使用switch语句根据选择调用相应的功能函数。当用户选择退出时,程序结束;若输入无效选择,则提示用户重新输入。

三、系统优化与扩展方向

1. 多线程支持:引入多线程技术,实现任务的并行执行,提升任务处理效率。

2. 任务状态管理:增加任务状态(如等待、运行、完成)的管理,更直观地展示任务执行情况。

3. 时间片轮转调度:结合时间片轮转算法,优化任务调度策略,避免高优先级任务长时间占用资源。

4. 数据持久化:将任务信息保存到文件中,下次启动程序时能够恢复任务数据继续管理 。

四、总结

本文通过C语言实现了一个简单任务管理器,涵盖任务的创建、查看、删除、优先级调整以及调度执行等核心功能。通过该项目实践,深入应用了C语言中的结构体、链表、内存管理和流程控制等知识。在实际应用中,可根据需求对任务管理器进行优化和扩展,进一步提升其功能和实用性,同时也有助于加深对任务调度和优先级管理机制的理解 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值