数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
用PB编写多线程应用程序

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 

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




相关文章

相关软件