关于PowerBuilder多线程的一些心得

最近在看.Net多线程的时候突然想到PowerBuiler是否支持多线程开发呢?于是Google了下,原来真的可以,不过比较遗憾的是这关于PB多线程方面的资料无论是英文的还是中文的都十分稀缺,完全没有详细的资料可查,连官网都一样,PB自带的帮助文档就更不用说的,简陋啊!!于是自己摸着石头过河,其中也遇到不少莫名其妙的问题,但多数是IDE本身语义检测的缺陷,谁让这不是VS呢?...

----------- 正题分割线 -----------

在PB里要使用多线程开发应用程序必须的3个系统函数:

SharedObjectRegister(string classname,string instancename):

函数功能:共享一个以classname为类型名称的对象,并产生一个新的线程实例,名为instancename.

返回值:枚举类型,Success!表示成功,其他的可以F1.

SharedObjectGet(string instancename,objectinstance):

函数功能:获取SharedObjectRegister创建的线程对象实例的引用,并赋值给objectinstance变量.*objectinstance类型是instancename注册时的类型或继承自它.如果获取不成功,将不对objectinstance操作.

返回值:同上.

SharedObjectUnRegister(string instancename):

函数功能:注销线程实例名为instancename的子线程.

返回值:同上.

还有一个函数SharedObjectDirectory(string instancenames[]{,string classnames[]})函数,得到所有注册的实例名和注册的类型.

PB的多线程有很多限止,以下几个目前发现需要注意的地方:

1.主线程与子线程的资源是相互独立的,子线程可以访问在程序中定义的全局变量,但在线程中对其做的任何修改将不对主线程产生影响.如果有一个全局的引用类型的变量,虽然在主线程中已经实例化但在子线程中访问的时候它是没有被实例化的,这就是它们资源相互独立的地方,主线程与子线程都有相同的全局变量定义,但其作用域只在它们各自的线程内,子线程与子线程之间也是一样,就算是同一个对象里定义了Shared Variables,注册为不同的线程实例,它的资源也是相互独立的,这一点非常的重要.

2.主线程与子线程通讯只能通过NonVisualObject类型或继承自NonVisualObject类型的实例来传递数据,而且传递的数据只能是基本类型的数据,不能传递引用类型的数据,如datastore,transaction等.所有的通讯都只能在这个NonVisualObject类型的中间对象处理,NonVisualObject类型是运行在主线程的.引用类型在哪个线程里Create就是哪一个线程中的资源.

3.操作子线程时,如果是异步调用则必须在函数调用前加Post关键字,如果不加则是同步调用.

4.如果子线程正在执行函数,那么此时不能同步对子线程进行操作,否则将会使线程阻塞造成死锁,所以一定要处理好线程间的资源同步与互斥,这就是为什么有很多人抱怨PB多线程容易使程序挂掉的关键所在.

5.使用SharedObjectUnRegister将线程注销后不会销毁注册的对象实例,而那个对象实例仍然是工作在子线程上过的,不过不能再用SharedObjectGet获取到该线程名的实例引用,但此时可以以这个名字重新注册它,所以当你不再使子线程时应该及时销毁其实例对象以回收内存.

6.子线程Halt了主线程不会退出,相反主线程Halt子线程会退出.

7.SharedObjectRegister注册后的线程可以在程序的任何位置获取,线程名必须是唯一的.

----------- Sample code -----------

//将w_ThreadTest窗口设为回调对象的父对象 *明义上
		QueryCallBack.of_SetParent(Parent)

新建6个NonVisualObject对象:
nvo_ThreadBase		//用于创建线程的基类对象.
nvo_ExpThread		//导出线程,继承自nvo_ThreadBase
nvo_QueryThread		//查询线程,继承自nvo_ThreadBase
nvo_CallBackBase	//线程的回调基类对象
nvo_ExpCallBack		//导出线程回调对象,继承自nvo_CallBack
nvo_QueryCallBack	//查询线程回调对象,继承自nvo_CallBa
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
PowerBuilder是美国Powersoft公司于90年代初推出的基于客户/服务器体系结构的面向对象的数据库开发工具。该产品一上市即深受广大应用开发人员的喜爱,因此迅速占领市场,目前几乎已发展成为前端工具的事实上的标准。著名数据库软件公司Sybase收购Powersoft公司以后,PowerBuilder通过Sybase较早地介绍给了中国用户。 1994年Powersoft公司又在北京建立办事处,PowerBuilder便广泛为中国的用户接受和使用。所开发的应用已广泛地应用于金融、证券、邮电、商业等各个部门和各个领域,并发挥着巨大的作用。据有关方面统计,PowerBuilder在中国的市场占有率目前已达40%左右。 Sybase公司及其代理商在从事PowerBuilder的销售、培训和技术支持等服务时,经常发现由于用户来自各个行业,专业背景不同,开发经验不同,再兼之国内的有关书籍和资料较少,因此造成用户对Power-Builder的很多特性不甚了解, 在进行深入开发时遇到了很多困难。鉴于此,开办PowerBuilder应用开发系列讲座,本讲座面向正在使用PowerBuilder进行开发的读者, 主要讨论使用PowerBuilder进行数据库应用开发的经验和开发技巧。<br><br> * 第一讲: 数据库的事务管理<br> * 第二讲: 调用Windows的动态链接库<br> * 第三讲: PowerBuilder面向对象的程序设计<br> * 第四讲: 并发控制<br> * 第五讲: DataWindow的打印输出<br> * 第六讲: DataWindow的打印输出(续)<br> * 第七讲: 利用SetActionCode函数控制DataWindow<br> * 第八讲: 分布式PowerBuilder设计<br> * 第九讲: DataWindow的数据缓冲区<br> * 第十讲: 用DataWindow实现对多表的修改<br> * 第十一讲:游标的使用<br> * 第十二讲:预装入对象<br> * 第十三讲:资源管理<br> * 第十四讲:PowerBuilder的事件<br> * 第十五讲:PowerBuilder的事件(续)<br> * 第十六讲:生成可重用的数据窗口<br> * 第十七讲:编写行选择函数<br> * 第十八讲:优化数据库查询<br> * 第十九讲:使用PowerBuilder另外500个函数(上)<br> * 第二十讲:使用PowerBuilder另外500个函数(中)<br> * 第二十一讲:使用PowerBuilder另外500个函数(下)<br> * 第二十二讲:树型视图控件<br> * 第二十三讲:函数与事件<br> * 第二十四讲:Install Builder 的使用方法<br> * 第二十五,二十六讲:一个代码维护的应用程序(上、下)<br> * 第二十七讲:在 PowerScript 脚本中访问数据窗口中的数据<br> * 第二十八讲:开发和运行环境中的动态连接库<br> * 第二十九讲:如何使用 BLOB 数据类型<br> * 第三十讲:在数据窗口中使用滚动条<br> * 第三十一讲:在数据窗口中使用滚动条(续)<br> * 第三十二讲:为下拉式数据窗口建立缓冲区<br> * 第三十三讲:为下拉式数据窗口建立缓冲区(续)<br> * 第三十四讲:布式事务处理<br> * 第三十五讲:布式应用开发<br> * 第三十六讲:FUNCky 的使用<br> * 第三十七讲:PFC介绍<br> * 第三十八讲:PowerBuilder 6.0 简介<br> * 第三十九讲:图形用户界面设计<br> * 第四十讲:图形用户界面设计(续)<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值