Gantt_Chart-Task_Chart-1-配置task_chart的数据

 

1. task chart 需要两个data provider: 

1) task data provider包含任务数据, 可以是一级的或者多级的或者分组的数据, 使用TaskChart的taskDataProvider属性来设置, task chart的数据表格完全使用AdvancedDataGrid所提供的功能

2) constraint data provider包含约束数据, 是一组同级别的数据, 使用TaskChart的constraintDataProvider属性来设置

 

除了设置TaskChart的taskDataProvider和constraintDataProvider, 还需要:

1) 指定每一列所对应的task数据项

2) 指定在gantt图中所对应的task数据项

3) 指定在gantt图中constraint数据之间的约束关系

 

2. constraint data provider必须是list-based的, 可以是

1) XML

包含xml文本的字符串; 

E4X格式的XML数据: <mx:XML> 或者 <mx:XMLList>

XML或者XMLList对象

2) IList 或者 ICollectionView

任何实现了IList 或者 ICollectionView的类的对象(例如: ArrayCollection 或者 XMLListCollection )

3) 其他对象

一个包含数据项的数组, 或者一个对象

 

当设置了TaskChart的constraintDataProvider属性之后, 会按照以下规则来使用:

1) XML 和 XMLList, 被包装成一个XMLListCollection对象

2) IList 和 ICollectionView, 直接使用

3) Array, 被包装成一个ArrayCollection对象

4) SctionScript 对象或者其他数据类型, 被包装成

例如, 当设置constraintDataProvider属性为一个Array对象时, 如果再去读取constraintDataProvider属性, 返回的将是一个ArrayCollection对象

 

3. 指定每一列所对应的task数据项

例: data provider的数据为:

id: "T1",

name: "Task #1",

startTime: "1/14/2008 8:0:0",

endTime: "1/28/2008 17:0:0"

指定数据项为:

<ilog:dataGrid>

<ilog:GanttDataGrid>

<ilog:columns>

<mx:AdvancedDataGridColumn dataField="name"  headerText="Name"/>

<mx:AdvancedDataGridColumn dataField="id" headerText="ID"/>

<mx:AdvancedDataGridColumn dataField="startTime" headerText="Start"/>

<mx:AdvancedDataGridColumn dataField="endTime" headerText="End"/>

</ilog:columns>

</ilog:GanttDataGrid>

</ilog:dataGrid>

 

4. 指定task数据项所对应的标签

taskEndTimeField        endTime or @endTime        task的结束时间

taskIsMilestoneField    milestone or @milestone     是否是milestone task

taskIsSummaryField   summary or @summary      是否是summary task

taskLabelField             name or @name                 task的名称

taskStartTimeField      startTime or @startTime      task的开始时间

 

1) taskEndTimeField和taskStartTimeField必须是一个时间对象或者是一个可以直接用来创建时间对象的字符串

2) taskIsMilestoneField和taskIsSummaryField必须是Boolea对象或者是 "true" 或 "false" 当中的任意一个字符串, 包含子task的任务会被默认的认为是summary task

 

5. 指定解析task数据项的方法(函数)

如果需要第二种方法来解析task数据, 可以使用taskEndTimeFunction, taskLabelFunction, taskStartTimeFunction, taskIsMilestoneFunction and taskIsSummaryFunction这些属性来获得end time, label, start time, milestone flag, and summar

例:

<?xml version="1.0"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:ilog="http://www.ilog.com/2007/ilog/flex">

<mx:Script>

<![CDATA[

import mx.collections.HierarchicalData;

 

[Bindable]

public var tasks:HierarchicalData = new HierarchicalData([

{ id: "T1", name: "Task #1", startTime: "1/14/2008 8:0:0", endTime: "1/28/2008 17:0:0" },

{ id: "T2", name: "Milestone #1", milestone: "true", startTime: "1/29/2008 8:0:0", endTime: "1/29/2008 08:0:0" }

]);

 

public function parseDate(value:String):Date {

return new Date(value);

}

public function startTimeFunction(item:Object):Date {

return parseDate(item.startTime);

}

public function endTimeFunction(item:Object):Date {

return parseDate(item.endTime);

}

public function isMilestoneFunction(item:Object):Boolean {

return new Boolean(item["milestone"]);

}

]]>

</mx:Script>

 

<ilog:TaskChart

width="100%" height="100%"

taskDataProvider="{tasks}"

taskStartTimeFunction="{startTimeFunction}"

taskEndTimeFunction="{endTimeFunction}"

taskIsMilestoneFunction="{isMilestoneFunction}">

</ilog:TaskChart>

</mx:Application>

6. 指定constraint数据

1) 指定constraint数据所对应的标签

constraintKindField        kind or @kind        指定constraint的种类, 可选的值有startToStart, startToEnd, endToStart, endToEnd

2) 可以使用constraintKindFunction属性来从constraint数据当中或组kind的值

3) 指定tasks和constraints之间的关系

(1) TaskChart按照以下的规则来创建tasks和constraints之间的关系

一个task可以是0个或多个constraint的source或者destination

一个constraint包含一个source task和一个destination task

(2) 

taskIdField                      id or @id task data         provider的内部唯一标示符, task的field

constraintFromIdField      fromId or @fromId        constraint的source task的id, constraint的field

constraintToIdField          toId or @toId                constraint的destination task的id, constraint的field

如果在外面改变了tasks和constraints之间的关系, 需要调用ICollectionView.itemUpdated()方法来告诉data provider数据已经改变了

(3) TaskChart提供了以下方法

getFromTask(constraint:Object):Object — 返回constraint的source task

getToTask(constraint:Object):Object — 返回constraint的destination task

getFromConstraints(task:Object):Array — 返回source为参数task的constraint数组

getToConstraints(task:Object):Array — 返回destination为参数task的constraint数组

 

#include <stdio.h> #include <stdlib.h> // 定义任务结构体 typedef struct Task { int id; // 任务ID int execution_time; // 执行时间 int deadline; // 截止时间 int priority; // 优先级(可选) } Task; // 比较函数:按截止时间排序 int compare_by_deadline(const void* a, const void* b) { Task* task_a = (Task*)a; Task* task_b = (Task*)b; if (task_a->deadline == task_b->deadline) { return task_a->priority - task_b->priority; // 如果截止时间相同,按优先级排序 } return task_a->deadline - task_b->deadline; // 按截止时间升序排序 } // 打印任务信息 void print_task(const Task* task) { printf("Task ID: %d, Execution Time: %d, Deadline: %d, Priority: %d\n", task->id, task->execution_time, task->deadline, task->priority); } // 主函数 int compare_by_deadline(const void* a, const void* b) { Task* task_a = (Task*)a; Task* task_b = (Task*)b; if (task_a->deadline == task_b->deadline) { return task_a->priority - task_b->priority; // 如果截止时间相同,按优先级排序 } return task_a->deadline - task_b->deadline; // 按截止时间升序排序 }typedef struct Task { int id; // 任务ID int execution_time; // 执行时间 int deadline; // 截止时间 int priority; // 优先级(可选) } Task; int main() { // 定义一组任务 Task tasks[] = { {1, 3, 4, 5}, // 任务ID, 执行时间, 截止时间, 优先级 {2, 2, 2, 6}, {3, 4, 6, 4}, {4, 1, 3, 7} }; int num_tasks = sizeof(tasks) / sizeof(tasks[0]); // 按截止时间排序任务 qsort(tasks, num_tasks, sizeof(Task), compare_by_deadline); // 模拟调度过程 int current_time = 0; for (int i = 0; i < num_tasks; i++) { Task* current_task = &tasks[i]; printf("Time %d: Scheduling Task %d (Deadline: %d)\n", current_time, current_task->id, current_task->deadline); current_time += current_task->execution_time; if (current_time > current_task->deadline) { printf("Warning: Task %d missed its deadline!\n", current_task->id); } } return 0; } 修改
06-06
#include <stdio.h> #include <stdlib.h> // 定义任务结构体 typedef struct { int id; // 任务ID int period; // 周期 int execution; // 执行时间 int deadline; // 截止时间(通常等于周期) int remaining_time; // 剩余执行时间 } Task; // 比较函数:按截止时间排序 int compare_by_deadline(const void *a, const void *b) { Task *task_a = (Task *)a; Task *task_b = (Task *)b; if (task_a->deadline == task_b->deadline) { return task_a->id - task_b->id; // 如果截止时间相同,按任务ID排序 } return task_a->deadline - task_b->deadline; // 按截止时间升序排序 } // 初始化任务 void initialize_tasks(Task tasks[], int num_tasks) { for (int i = 0; i < num_tasks; i++) { tasks[i].remaining_time = tasks[i].execution; } } // 打印Gantt图 void print_gantt_chart(int time, int current_task_id) { printf("| T%d ", current_task_id); for (int i = 0; i < time; i++) { printf("="); } printf(">"); } // EDF调度算法 void edf_schedule(Task tasks[], int num_tasks, int total_time) { int current_time = 0; Task current_task = {0, 0, 0, 0, 0}; while (current_time < total_time) { Task *next_task = NULL; int earliest_deadline = total_time; // 查找下一个具有最早截止时间的任务 for (int i = 0; i < num_tasks; i++) { if (tasks[i].remaining_time > 0 && tasks[i].deadline < earliest_deadline) { next_task = &tasks[i]; earliest_deadline = tasks[i].deadline; } } if (next_task != NULL) { current_task = *next_task; print_gantt_chart(current_time, current_task.id); // 打印Gantt图 current_task.remaining_time -= 1; current_time += 1; if (current_task.remaining_time == 0) { printf(" (Task %d Completed at Time %d)\n", current_task.id, current_time); current_task.deadline += current_task.period; // 更新任务的截止时间 current_task.remaining_time = current_task.execution; // 重置任务的剩余执行时间 } } else { printf("| Idle "); for (int i = 0; i < current_time; i++) { printf("="); } printf(">\n"); current_time += 1; } } } // 主函数 int main() { // 定义一组任务 Task tasks[] = { {1, 5, 2, 5, 2}, // 任务ID, 周期, 执行时间, 截止时间, 剩余执行时间 {2, 10, 3, 10, 3}, {3, 20, 5, 20, 5} }; int num_tasks = sizeof(tasks) / sizeof(tasks[0]); int total_time = 50; // 初始化任务 initialize_tasks(tasks, num_tasks); // 按截止时间排序任务 qsort(tasks, num_tasks, sizeof(Task), compare_by_deadline); // EDF调度 edf_schedule(tasks, num_tasks, total_time); return 0; }结果不对
06-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值