当前位置:首页>> PowerBuilder>> PB入门

全文搜索

精华导读

·EasyERP2004 制造行业通用性ERP管理系统
·PB中表的修改对数据窗口和报表的影响的解决办法
·在PB中实现Word内容的替换
·office xp风格菜单基本版
·用PB制作outlook界面源程序(非原来的老外版本)(
·将所见dw内容(包括计算字段)输出到execl中
·ERP在中国应用面临的问题
·PB中使用FORMULA ONE(实例篇
·控制打印机的动态库,兼容win98/98/me/nt2000/xp
·易佳自定义报表系统
·用例驱动的需求过程实践

最新发表

·仿windows优化大师界面(源码)
·常见问题的经典解决之SPLITBAR
·pb技巧
·PowerBuilder 10 Beta1下载和相关信息
·如何在pb9中调用WebService
·在非PB9 JSP Target的jsp网页中调用EAServer组件
·质量管理的十三项步骤和八项原则
·用预测性对象点度量面向对象软件(下)
·用预测性对象点度量面向对象软件(上)
·软件开发度量及考核方法
·点度量(4)—最新发布度量方法及参考
·点度量(3)—功能规模度量方法选择
·点度量(2)—功能规模度量方法评价
·点度量(1)—功能规模度量方法概述
·如何对软件质量进行评估
·从印度软件项目管理谈我国软件质量保障
·步步为营,把好质量关
·软件产品的可用性的测试
·软件测试认识的几个误区

用PB编写多线程应用程序

文章来源:互联网络 文章编辑:admin 添加时间:2004-2-4

多线程是指一个程序内部同时执行的多个流程,与单线程相比,它至少有两个方面的优点:第一,它可以更好地利用系统资源,比如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就是点击“多线程”后执行的一瞬间

[ ]

首页 评论 打印 刷新 返回顶部 关闭
【相关文章】  【相关评论】
目前暂时没有相关文章