Linux多窗口运行多进程,多进程,多窗体 - chenyi1982的个人空间 - OSCHINA - 中文开源技术交流社区...

本文主要是介绍Linux多窗口运行多进程,多进程,多窗体 - chenyi1982的个人空间 - OSCHINA - 中文开源技术交流社区...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更详细的讲解和代码调试演示过程,请参看视频

Linux kernel Hacker, 从零构建自己的内核

为了让多任务的特性展示的更直观,本节,我们基于多任务的基础上,为系统实现多个窗口特效,每个窗口都运行于一个任务或进程。由于窗口基于各自不同的进程,因此窗口自身的变化更新不会影响到其他窗口。

我们看看相关代码:

void CMain(void) {

initBootInfo(&bootInfo);

unsigned char *buf_win_b;

struct SHEET *sht_win_b[3];

static struct TASK *task_b[3];

....

char taskTitle[6] = {'t','a','s','k', 0, 0};

int i = 0;

for (i = 0; i < 2; i++) {

sht_win_b[i] = sheet_alloc(shtctl);

buf_win_b = (unsigned char*)memman_alloc_4k(memman, 144*52);

char c = 'b' + i;

taskTitle[4] = c;

sheet_setbuf(sht_win_b[i], buf_win_b, 144, 52, -1);

make_window8(shtctl, sht_win_b[i], taskTitle);

task_b[i] = task_alloc();

task_b[i]->tss.ldtr = 0;

task_b[i]->tss.iomap = 0x40000000;

task_b[i]->tss.eip =  (int)(task_b_main - addr_code32);

task_b[i]->tss.es = 0;

task_b[i]->tss.cs = 1*8;//6 * 8;

task_b[i]->tss.ss = 4*8;

task_b[i]->tss.ds = 3*8;

task_b[i]->tss.fs = 0;

task_b[i]->tss.gs = 2*8;

task_b[i]->tss.esp -= 4;

*((int*)(task_b[i]->tss.esp + 4)) = (int)sht_win_b[i];

task_run(task_b[i]);

}

sheet_slide(shtctl,sht_win_b[0], 16, 28);

sheet_updown(shtctl, sht_win_b[0], 1);

sheet_slide(shtctl, sht_win_b[1], 160, 28);

sheet_updown(shtctl, sht_win_b[1], 1);

//switch task

....

}

在上面的主入口函数中,我们先定义一个窗口数组对象sht_win_b, 已经任务数组对象task_b, 每一个任务对象对应一个窗口对象。接着在for循环中,启动两个进程,这两个进程运行的函数都是task_b_main, 这里需要特别注意的是,如何把窗口对象传递给进程:

task_b[i]->tss.esp -= 8;

((int)(task_b[i]->tss.esp + 4)) = (int)sht_win_b[i];

esp 对应进程的堆栈,要想把数据传递给进程,我们可以把数据压到进程的堆栈上,我们像把esp 减8,这样就可以空出8个字节,从中拿出4个字节用于存储对应的窗口对象。

然后通过调用sheet_slide 和 sheet_updown 将窗口挪到桌面合适位置。

我们看task_b_main函数的相关实现:

void task_b_main(struct SHEET *sht_win_b) {

showString(shtctl, sht_back, 0, 160, COL8_FFFFFF, "enter task b");

struct FIFO8 timerinfo_b;

char timerbuf_b[8];

struct TIMER *timer_b = 0;

int i = 0;

fifo8_init(&timerinfo_b, 8, timerbuf_b, 0);

timer_b = timer_alloc();

timer_init(timer_b, &timerinfo_b, 123);

timer_settime(timer_b, 100);

int count = 0;

int pos = 0;

for(;;) {

count++;

io_cli();

if (fifo8_status(&timerinfo_b) == 0) {

io_sti();

} else {

i = fifo8_get(&timerinfo_b);

io_sti();

if (i == 123) {

showString(shtctl, sht_back, pos, 192, COL8_FFFFFF, "B");

// farjmp(0, 8*8);

timer_settime(timer_b, 100);

pos += 8;

boxfill8(sht_win_b->buf, 144, COL8_C6C6C6, 24, 28, 104, 44);

sheet_refresh(shtctl, sht_win_b, 24, 28, 104, 44);

char *p = intToHexStr(count);

showString(shtctl, sht_win_b, 24, 28, COL8_FFFFFF,p);

}

}

}

}

task_b_main函数跟以前不同的是,它多了一个输入参数,这个参数就是它需要处理的窗口对象。task_b_main运行时,在它的循环体中,它会初始化一个计数器,然后把计数器的数值转换成字符串,然后再把字符串显示到窗口的内部,相关代码就是下面这几句:

showString(shtctl, sht_back, pos, 192, COL8_FFFFFF, "B");

// farjmp(0, 8*8);

timer_settime(timer_b, 100);

pos += 8;

boxfill8(sht_win_b->buf, 144, COL8_C6C6C6, 24, 28, 104, 44);

完成上面代码后,编译内核,将内核加载到虚拟机后,运行情况如下:

6ca5fe3b25609c6a9bba77295a9ebcff.png

桌面上产生了两个额外窗口,窗口的标题分别是taskb和taskc, 同时这两个窗口内,分别有两个计数字符串在不断的变动更新,这表明,两个窗口运行在不同的进程中,他们之间相互对立,互不影响。通过视频可以看到更详细的动态效果。

这篇关于Linux多窗口运行多进程,多进程,多窗体 - chenyi1982的个人空间 - OSCHINA - 中文开源技术交流社区...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_39724287/article/details/116676525
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/342607

相关文章

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc