Powerbuilder中实现多线程同步查询
Powerbuilder中实现多线程同步查询
一、引言
数据库查询是任何一个信息系统都必须实现的功能。而在查询时不可避免地会有一段时间的等待,即鼠标变成了查询等待状态
这时用户只能无奈的等待。遇到急性子的,干脆在此时尝试windows中的其它应用程序,结果致使你的数据库应用显示一大片
白色的窗口,真是无奈。
本文将以简单的例子告诉你如何实现线程查询。还等什么,赶快打开powerbuilder对照着下面的完整源代码试试吧。
在查询时能够做别的事情或者取消查询,这只是基本的查询,在你阅读了powerbuilder有关帮助后能立即实现。这里介绍的是
多个线程查询的同步执行。
通常情况下,每个数据库应用中只有这一个会话。无论是查询还是修改数据。在同一时间内只能进行其中的一件事情,而且进
行这一件事情的时候应用程序不能响应鼠标、键盘以及其它的windows消息。这就是在窗口区域会显示一片空白的原因所在。当然
只要将查询或数据操作重构造成线程对象,情况会好一些,至少可以接受窗口消息,也可以随时终止查询或数据操作,而不会在屏
幕上显示出太难看的白色。不过,这只是解决了问题的一部分。假如在进行一个线程查询的时候,用户通过按钮或菜单又发出了另
一个查询的命令,这可如何是好,难道终止正在执行的数据库访问吗?解决之道就是:多线程同步查询。
多线程强调的是一个进程内部有多个流程在同时执行,同时执行的概念相当于pb分布式计算中的异步处理,下面的例子将告诉
你在pb中如何利用分布式计算技术来开发多线程应用程序。
本例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗口的创建和销毁而创建和销毁。你可以就此进行改进,为
每一个数据查询或数据操作命令创建一个单独的线程对象,从而达到多线程同步查询的目的。
注意:应用程序中的线程不是越多越好,因为线程将严重吞噬cpu资源,尽管看上去并不明显。谨慎创建和销毁线程将避免你
的应用程序导致资源崩溃。
二、程序设计
1、新建application,加open事件代码
// Profile EAS Demo DB V120
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V120;UID=dba;PWD=sql'"
connect using sqlca;
if sqlca.sqlcode<>0 then
messagebox("错误","连接失败")
else
open(w_thread_main)
end if
2、新建用户对象(custom class),无须编码,保存为uo_midobjectparent,该对象为 后来要创建对象uo_midobject1和uo_midobject2
的父类。
3、新建用户对象(custom class),命名为uo_thead,添加如下实例变量:
uo_midobjectparent mo_arg
创建如下两个用户函数
( 1)uf_start,功能是向中间对象发送ue_thread消息。脚本为
mo_arg.triggerevent('ue_thread')
(2)uf_setparent(uo_midobjectparent imo_arg),调用时,使用中间对象为参数。脚本为:
mo_arg=imo_arg
4、设计中间对象,命名为uo_midobject1,添加如下实例变量
window win_arg
创建用户函数uf_setparent(window w_argv),调用时,用主窗口作为参数,其脚本为:
win_arg=w_argv
声明用户事件ue_thread,用于对uo_thread1发出的uo_thread消息进行响应,其脚本为:
win_arg.triggerevent('ue_retrieve1')
uo_midobject2和uo_midobject1完全一样,只需要将uo_midobject1中的ue_thread1改为uo_thread2即可
5、设计主窗口w_thread_main
放置两个数据窗口,dw_1和dw_2,其dataobject分别对应两个数据窗口对象。
放置一个查询按钮,声明并创建一个事务对象trans,并设置好其属性。
定义实例变量:
uo_midobject1 uo_arg1
uo_midobject2 uo_arg2
uo_thread uo_thread1,uo_thread2
transaction trans
主窗口w_thread_main声明两个用户事件;ue_retrieve1和ue_retrieve2,分别用于对中间对象发送来的ue_thread1和ue_thread2消息进行响应。
ue_retrieve1事件处理代码为:
connect using sqlca;
dw_1.settransobject(sqlca)
dw_1.retrieve()
ue_retrieve2事件处理代码为:
connect using trans;
if trans.sqlcode<>0 then
messagebox("错误","连接失败")
end if
dw_2.settransobject(trans)
dw_2.retrieve()
主窗口w_thread_main的open事件代码为:
trans= create transaction //声明并创建一个事务对象trans
trans.DBMS = "SNC SQL Native Client(OLE DB)"
trans.ServerName = "127.0.0.1"
trans.LogId = "sa"
trans.AutoCommit = False
trans.DBParm = "Database='tccw'"
uo_arg1=create uo_midobject1
uo_arg2=create uo_midobject2
uo_arg1.uf_setparent(this)
uo_arg2.uf_setparent(this)
在查询按钮的clicked事件中加入下列代码:
dw_1.reset()
dw_2.reset()
sharedobjectregister('uo_thead','uo_midobject1')
sharedobjectregister('uo_thead','uo_midobject2')
sharedobjectget('uo_midobject1',uo_thread1)
sharedobjectget('uo_midobject2',uo_thread2)
uo_thread1.uf_setparent(uo_arg1)
uo_thread2.uf_setparent(uo_arg2)
uo_thread1.post uf_start()
uo_thread2.post uf_start()
w_thread_main的close事件代码为:
destory trans
destory uo_arg1
destory uo_arg2
至此程序编码结束,我们利用了pb中分布式计算技术来开发多线程应用程序,实现了同步查询功能。