2014年9月25日星期四

[自制简单操作系统] 7、多任务(二)——任务管理自动化&任务休眠 - beautifulzzzz

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
[自制简单操作系统] 7、多任务(二)――任务管理自动化&任务休眠 - beautifulzzzz  阅读原文»

前言

>_<" 这里仿照窗口管理的方式将任务管理也修改成相应的管理模式,这样可以灵活的添加多个任务,而不必每次都要修改任务切换函数;此外还在任务休眠做了尝试,通过将任务挂起和唤醒从而加快运行速度~

一、任务管理自动化

>_<" 为了仿照窗口管理模式对任务进行管理,于是在bootpack.h里做如下定义:

1 /* mtask.c 任务切换相关*/
2 #define MAX_TASKS 1000 /* 最大任务数量 */
3 #define TASK_GDT0 3 /* 定义从GDT的几号开始分配给TSS */
4
5 struct TSS32 {//task status segment 任务状态段
6 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;//保存的不是寄存器的数据,而是与任务设置相关的信息,在执行任务切换的时候这些成员不会被写入(backlink除外,某些情况下会被写入)
7 int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;//32位寄存器
8 int es, cs, ss, ds, fs, gs;//16位寄存器
9 int ldtr, iomap;//有关任务设置部分
10 };
11 struct TASK {
12 int sel, flags; /* sel用来存放GDT的编号 */
13 struct TSS32 tss;
14 };
15 struct TASKCTL {
16 int running; /* 正在运行的任务量数 */
17 int now; /* 这个变量用来记录当前正在运行的任务是哪一个 */
18 struct TASK *tasks[MAX_TASKS];
19 struct TASK tasks0[MAX_TASKS];
20 };
21 extern struct TIMER *task_timer;
22 struct TASK *task_init(struct MEMMAN *memman);//初始化任务控制
23 struct TASK *task_alloc(void);//分配一个任务
24 void task_run(struct TASK *task);//将task添加到tasks的末尾,然后running加1
25 void task_switch(void);//running为1的时候不用进行任务切换,函数直接结束,当running大于2的时候,先把now加1
26 //再把now代表的任务切换成当前的任务,最后再将末尾的任务移到开头

PS:可以看出和窗口管理很相似,TASK是一个任务,TASKCTL是任务管理结构体

>_<" 下面是对应的任务管理.c文件,其中task_init函数是初始化任务控制,task_alloc是分配一个任务函数,task_run其实就相当于唤醒,task_switch任务切换

1 /* 任务管理相关程序 */
2
3 #include "bootpack.h"
4
5 struct TASKCTL *taskctl;
6 struct TIMER *task_timer;
7
8 /////////////////////////////////////////////////////////////////////////////////////
9 //功能:初始化任务控制
10 //参数:
11 //返回:返回一个内存地址,意思是现在正在运行这个程序,已经变成一个任务
12 struct TASK *task_init(struct MEMMAN *memman)
13 {
14 int i;
15 struct TASK *task;
16 struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
17 taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL));//TASKCTL是个很大的结构体,所以要申请一个内存空间
18 for (i = 0; i < MAX_TASKS; i++) {
19 taskctl->tasks0.flags = 0;
20 taskctl->tasks0.sel = (TASK_GDT0 + i) * 8;
21 set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0.tss, AR_TSS32);//定义在gdt的号,段长限制为103字节
22 }
23 task = task_alloc();
24 task->flags = 2; /* 活动中标志 */
25 taskctl->running = 1;
26 taskctl->now = winform中ComboBox利用AutoComplete属性实现模糊查询(有缺陷) - 枫上善若水  阅读原文»

  上一篇文章是用ComboBox里面的原生事件实现模糊查询,操作比较灵活一些,但是收到评论说,利用AutoComplete属性就可以实现模糊查询,但是据本人所了解,AutoComplete虽然能够方便的实现模糊查询,但是有一定的缺陷,就是,模糊查询只能从左往右。

  上一篇连接地址:http://www.cnblogs.com/xilipu31/p/3993049.html

  下面是简单的实现方式:

  前台:一个简单的form窗体+ComboBox控件

  后台:申明List<string> listOnit用于初始化ComboBox的备选数据,然后设置ComboBox属性:AutoCompleteSource(自动完成数据源),AutoCompleteMode(提示类型)以及AutoCompleteCustomSource(绑定数据源)。

  具体代码如下:

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TimerDemo
{
public partial class Form3 : Form
{
//初始化绑定默认关键词(此数据源可以从数据库取)
List<string> listOnit = new List<string>();

public Form3()
{
InitializeComponent();
}

private void Form3_Load(object sender, EventArgs e)
{
BindComboBox();
}

/// <summary>
/// 绑定ComboBox
/// </summary>
private void BindComboBox()
{
listOnit.Add("张三");
listOnit.Add("张思");
listOnit.Add("张五");
listOnit.Add("王五");
listOnit.Add("刘宇");
listOnit.Add("马六");
listOnit.Add("孙楠");
listOnit.Add("那英");
listOnit.Add("刘欢");

//自动完成数据源
this.comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
//提示类型 建议列表+自动补全
this.comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
//绑定数据源
this.comboBox1.AutoCompleteCustomSource.AddRange(listOnit.ToArray());
}
}
}

以下是实现效果截图:

从左到右输入关键词模糊查询(例如输入:张)

可以得出正确的提示和结果。

如果不是从左到右的模糊查询呢?(例如输入:三)

可以看出,并不能将模糊数据查询出来。

总结:

  ComboBox控件的AutoComplete事件可以用在模糊查询程度不高,从左到右的关键词搜索,如果想实现高级的模糊查询,还是自己定义的方式比较灵活一些。


本文链接:winform中ComboBox利用AutoComplete属性实现模糊查询(有缺陷),转载请注明。

阅读更多内容

没有评论:

发表评论