用PB编写多线程应用程序

原创 2001年07月06日 10:03:00
 

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

用PB编写邮件应用程序

   由于受到强大数据库功能的掩盖,PB的邮件功能鲜为人知。在VB中可以轻松地利用CDO控件发邮件(Delphi中用NMSMTP),而PB中的邮件函数比它们更灵活、方便。   PB以其独特高效的数据库...
  • nthb2001
  • nthb2001
  • 2001年07月06日 09:53
  • 875

编写多线程应用程序

package cn.scxh.java.thread; /*1.编写多线程应用程序,模拟多个人通过一个山洞的模拟。 这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人, 同时准...
  • qq_31158491
  • qq_31158491
  • 2015年09月14日 18:33
  • 339

用BCB编写多线程应用程序

  随着Windows系统的全球性普及,多线程技术已越来越多地运用到许多软件设计中。使用多线程技术可全面提高应用程序的执行效率。以前为了实现多线程编程,基本上都是调用一系列的API函数,如Create...
  • henhen2002
  • henhen2002
  • 2009年07月22日 08:29
  • 471

PB多线程的缺陷与实现机制浅析

昨天提到了PB多线程的问题,我其实一直都想写一个PB通用线程库,但一直没有找到好的方法去实现,主要的原因有几点。PB的多线程功能很少有人去深入分析过其实现机制,也没有在这方面的文档可以参考,以前我写过...
  • gaoqiangz
  • gaoqiangz
  • 2014年09月27日 18:12
  • 2211

用PB编写WinSock TCP/IP应用程序

   PB中的套接字是通过Winsock.pbl库来提供的,它封装了套接字编程中用到的数据结构和过程,在功能上类似于VB中的Winsock控件。   Winsock.pbl中定义了两种类型的Socke...
  • nthb2001
  • nthb2001
  • 2001年07月06日 10:02
  • 1145

关于PowerBuilder多线程的一些心得

最近在看.Net多线程的时候突然想到PowerBuiler是否支持多线程开发呢?于是Google了下,原来真的可以,不过比较遗憾的是这关于PB多线程方面的资料无论是英文的还是中文的都十分稀缺,完全没有...
  • gaoqiangz
  • gaoqiangz
  • 2011年08月12日 23:24
  • 10724

PowerBuilder开发简单计算器

简单计算器 指的是用户每输入完一个完整的表达式(一元或者二元)就计算。  1、设计好界面 2、在Declare Instance Variable里定义三个变量 decimal add1  //存...
  • acmjk
  • acmjk
  • 2015年03月05日 15:43
  • 1415

PB的多线程

最近还在学习PB,有点郁闷,还是不太喜欢PB啊 上周五看了一下PB,感觉还简单。本来已经动手,但因为周五下午有事出去,所以拖到今天。。 PB的多线程用到的就几个函数                  ...
  • namgking
  • namgking
  • 2008年12月01日 16:04
  • 6197

pb多线程的实现

最近在看.Net多线程的时候突然想到PowerBuiler是否支持多线程开发呢?于是Google了下,原来真的可以,不过比较遗憾的是这关于PB多线程方面的资料无论是英文的还是中文的都十分稀缺,完全没有...
  • z2007130205
  • z2007130205
  • 2013年02月26日 23:56
  • 1368

PowerBuilder9.0 使用动态sql语句(上)

前情提要     我们在学习vb.net的时候学习了参数化查询,也都知道这是防止SQL注入比较有效的手段。当然,参数查询还提高了代码的灵活性和复用性。其实现,是在SQL语句的动作一样时将查询的值独立...
  • zhuojiajin
  • zhuojiajin
  • 2014年02月23日 15:07
  • 3994
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用PB编写多线程应用程序
举报原因:
原因补充:

(最多只允许输入30个字)