分享
 
 
 

用PB编写多线程应用程序

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

多线程是指一个程序内部同时执行的多个流程,与单线程相比,它至少有两个方面的优点:第一,它可以更好地利用系统资源,比如CPU,若一个线程因I/O操作受阻,另一个线程仍可利用CPU来执行;第二,它更好地满足了客户的需求,因为挑剔的客户希望你开发的程序在显示动画的同时还能播放音乐、显示文件、下载网络文件等,这是单线程应用程序无法完成的。目前,支持多线程的开发工具主要有:Java、VC、Delphi和C++Builder。

多线程强调的是一个进程内部有多个流程在同时执行,同时执行的概念相当于PB分布式计算中的异步处理。也就是说,只要我们在一个程序内部实现了异步处理,就相当于实现了多线程。分析至此,下一步该怎么做就不言而喻了:在一个应用程序内部实现分布式计算,使用服务器推送技术,异步执行共享对象中的函数。

下面就编写一个Demo,介绍在PB中如何利用分布式计算技术来开发多线程应用程序,其程序结构如图1所示。uo—thread1和uo—thread2是类用户对象uo—thread的两个实例,uo—thread的功能是给实例变量li—Count自加5秒,自加的同时向中间对象uo—argv1和uo—argv2发送ue—thread消息。两个中间对象的功能是把ue—thread消息转化为ue—thread1和ue—thread2后发给主窗口w—main。

图1 程序结构

主窗口接收到ue—thread1消息后,显示uo—thread1中自加变量的值,接收到ue—thread2后,显示uo—thread2中自加变量的值。在单线程中,uo—thread1先执行,5秒钟后uo—thread2开始执行,因此,前5秒内主窗口只能收到ue—thread1消息,后5秒内只能收到ue—thread2消息。在多线程中,uo—thread1和uo—thread2同时执行,因此w—main可以不断地收到ue—thread1和ue—thread2消息。

1.设计用户对象uo—thread

新建一个类用户对象,命名为uo—thread,添加如下两个实例变量:

NonVisualObject inv—arg

Long li—Count //自加变量

创建如下三个用户函数:

⑴uf—start(),功能是:完成自加5秒并向中间对象发送ue—thread消息。脚本为:

Time t0

t0= Now() //获取当前时间

Do While SecondsAfter(t0,Now())〈=5

li—Count++//实例变量自加5秒

inv—arg.TriggerEvent(′ue—thread′)

//向中间对象发送ue—thread消息

Loop

⑵uf—getcount(),功能是:获取自加变量的瞬间值。其脚本为:

Return li—Count //返回实例变量

⑶uf—setparent(NonVisualObject nv—arg),调用时,使用中间对象为参数。脚本为:

inv—arg=nv—arg

//用中间对象给实例变量赋值

2.设计中间对象uo—argv1和uo—argv2

新建一个类用户对象,命名为uo—argv1,添加如下实例变量:

Window win—arg

创建用户函数uf—setparent(Window w—argv),调用时,用主窗口作为参数。其脚本为:

win—arg=w—argv

//用主窗口对象给实例变量赋值

声明用户事件ue—thread,用于对uo—thread1发出的uo—thread消息进行响应,其脚本为:

win—arg.TriggerEvent(″ue—thread1″)

//向主窗口发送ue—thread1消息

uo—argv2和uo—argv1完全一样,只需将uo—argv1中的ue—thread1改为uo—thread2即可。

3.设计主窗口w—main

主窗口外观如图2所示,凹下的三个控件分别为:st—thread1、st—thread2、st—time,分别用于显示uo—thread1和uo—thread2中自加变量的当前瞬间值和系统时间。声明两个用户事件:ue—thread1和ue—thread2,分别用于对中间对象发送来的ue—thread1和ue—thread2消息进行响应。ue—thread1事件处理代码为:

图2 主窗口

st—thread1.Text=String(uo—thread1.uf—getcount())

ue—thread2事件的处理代码为:

st—thread2.Text=String(uo—thread2.uf—getcount())

w—main的Open事件代码为:

uo—arg1 = Create uo—argv1

//初始化中间对象的一个实例

uo—arg2 = Create uo—argv2

uo—arg1.uf—setParent(This) //给中间对象的实例变量赋值

uo—arg2.uf—setParent(This)

Timer(1) //启动定时器

Timer事件处理代码为:

st—time.Text=String(Now())//显示当前时间

在“单线程”的Clicked事件中加入下列代码:

SharedObjectUnRegister(″object1″)

//注销先前注册过的共享对象object1

SharedObjectUnRegister(″object2″)

//注销先前注册过的共享对象object2

If IsValid(uo—thread1) Then Destroy uo—thread1 //若uo—thread1已经存在,先删除

If IsValid(uo—thread2) Then Destroy uo—thread2

uo—thread1=Create uo—thread

//初始化uo—thread1

uo—thread2=Create uo—thread

uo—thread1.uf—setparent(uo—argv1) //用中间对象给uo—thread1中的实例变量赋值

uo—thread2.uf—setparent(uo—argv2)

uo—thread1.Post uf—start() //执行uo—thread1中的uf—start()函数,完成后才执行下一句

uo—thread2.Post uf—start()

//上一条语句执行完成后才会执行

在“多线程”的Clicked事件中加入下列代码:

SharedObjectRegister(″uo—thread″,″object1″)

//将uo—thread对象注册为object1

SharedObjectRegister(″uo—thread″,″object2″)

//将uo—thread对象注册为object2

SharedObjectGet(″object1″,uo—thread1)

//用uo—thread1引用共享对象object1

SharedObjectGet(″object2″,uo—thread2)

//用uo_thread2引用共享对象object2

uo—thread1.uf—setparent(uo—argv1) //用中间对象给uo—thread1中的实例变量赋值

uo—thread2.uf—setparent(uo—argv2)

uo—thread1.Post uf—start() //利用服务器推送技术,异步调用共享对象中的uf—start()

uo—thread2.Post uf—start()//相当于启动线程

4.执行

执行程序后,图2就是点击“多线程”后执行的一瞬间

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有