PB中实现多线程技术

在PB中实现多线程技术,有两种方法:一种是用VC++将各种操作写入函数并编译成动态链接库供PB调用;另一种是用PB的SharedObject系列函数来实现多线程。本文基于PB的编程技术,介绍第二种实现方法。  
   
   
  PB中消息对话框的居中显示  
  上海大学   孙渊磊      
   
  SharedObject系列函数    
  和共享对象有关的函数包括:SharedObjectRegister、SharedObjectGet、SharedObjectUnregister和SharedObjectDirectory函数。    
  首先,用SharedObjectRegister函数初始化共享对象,并建立一个单独的线程。如:    
  SharedObjectRegister   (“ccuo_thread”   ,“thread1”   )    
  其中ccuo_thread是一个共享的自定义类用户对象的类名,thread1是共享对象实例的共享名。如果SharedObjectRegister函数返回Success,则新线程创建成功。    
  然后,执行指定代码。有两种方法让新线程执行指定的代码:一种是在自定义类用户对象的constructor事件中编写脚本,新线程创建后就会自动执行该事件脚本;另一种方法是使用SharedObjectGet函数。该函数实现共享对象实例的引用,如:    
  SharedObjectGet   (   “thread1”   ,inv_thread   )      
  其中inv_thread是用来存储共享对象实例的一个对象变量,要求与ccuo_thread具有同一个类名。    
  最后,通过使用Post语句,即以inv_thread.Post   of_function(agrs)的形式,异步调用共享对象的函数of_function。    
  在完成任务后,可以用SharedObjectUnregister函数中止线程,也可用SharedObjectDirectory函数列出所有有效的共享对象。    
  函数调用部分    
  本文所用Win32   API函数原型为:    
  Function   Ulong   FindWindowA   (   String   lpClassName   ,String   lpWindowName   )   Library   “user32.dll”    
  Function   Ulong   GetTickCount   (   )   Library   “kernel32.dll”      
  Function   Ulong   GetDesktopWindow   (   )   Library   “user32.dll”      
  Function   Boolean   GetWindowRect   (   Ulong   hWnd   ,ref   stc_rect   lpRect   )   Library   “user32.dll”    
  Function   Boolean   MoveWindow   (   Ulong   hWnd   ,int   X   ,int   Y   ,int   nWidth   ,int   nHeight   ,Boolean   bRepaint   )   Library   “user32.dll”      
  下面具体讨论如何实现消息对话框的居中显示:    
  //声明对象变量    
  ccuo_thread   lccuo_thread      
  //创建新线程    
  SharedObjectRegister   (‘ccuo_thread’   ,‘thread_center’   )    
  //引用实例    
  SharedObjectGet   (‘thread_center’   ,lccuo_thread   )      
  //调用窗口居中函数    
  lccuo_thread.Post   of_center   (‘#32770’   ,‘Demostration’   ,2000   )      
  //创建消息对话框    
  MessageBox   (   ‘Demostration’   ,‘Copyright(c)   2001   by   Y.L.Sun’   )      
  //中止线程    
  SharedObjectunRegister   (   ‘thread_center’   )      
  函数实现部分    
  实现窗口居中显示的函数是自定义类用户对象ccuo_thread的对象函数of_center,其实现代码如下:    
  ccuo_thread.of_center   (   String   lpclassname   ,String      
  lpwindowname   ,   Ulong   dwtimeout   )   return   Boolean    
  //lpclassname:   消息对话框的类名(#32770)    
  //lpwindowname:   消息对话框的标题    
  //dwtimeout:   超时计数    
  Ulong   lul_hwnd   //存放消息对话框的句柄    
  Ulong   lul_start   //计时开始时刻的值    
  lul_start   =   GetTickCount   (   )   //计时开始    
  do    
  //查找顶层窗口    
  lul_hwnd=FindWindowA   (   lpclassname   ,lpwindowname   )    
  //找到顶层窗口后,跳出循环    
  if   lul_hwnd   <>   0   then   exit    
  //判断是否已超时    
  loop   while   GetTickCount(   )-lul_start<   dwtimeout      
  //没有找到消息对话框    
  if   lul_hwnd   =   0   then      
  return   false      
  else    
  //对话框居中    
  return   of_center   (   0   ,lul_hwnd   )      
  end   if    
  of_center的重载函数代码如下:    
  ccuo_thread.of_center   (   Ulong   hwndp   ,Ulong   hwndc   )   return   Boolean    
  //hwndp:父窗口的句柄,值为0时认为是桌面    
  //hwndc:子窗口的句柄      
  int   li_x   //窗口的X坐标    
  int   li_y   //窗口的Y坐标    
  stc_rect   lstc_parent   //父窗口的4边坐标    
  stc_rect   lstc_child   //子窗口的4边坐标    
  //值为0时认为是桌面    
  if   hwndp   =   0   then   hwndparent   =      
  GetDesktopWindow   (   )      
  //获得窗口的4边坐标    
  if   not   GetWindowRect   (   hwndcurrent   ,lstc_child   )   then   return   false      
  if   not   GetWindowRect   (   hwndparent   ,lstc_parent   )   then   return   false    
  li_x   =   ((   lstc_parent.right   -   lstc_parent.left   )   -      
  (   lstc_child.right   -lstc_child.left   ))   /2    
  li_y   =   ((   lstc_parent.bottom   -   lstc_parent.top   )   -      
  (   lstc_child.bottom   -lstc_child.top   ))   /2    
  //计算子窗口的X、Y坐标    
  if   li_x   <   0   or   li_y   <   0   then   return   false      
  //移动子窗口    
  if   not   MoveWindow   (   hwndcurrent   ,li_x   ,li_y   ,lstc_child.right   -lstc_child.left   ,lstc_child.bottom   -   lstc_child.top   ,false   )   then   return   false      
  return   true    
  本文代码在PB   7.0下通过。    
  //   
   

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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>
PowerBuilder ,您可以使用多线程来加载数据窗口的数据,以提高应用程序的响应速度和用户体验。以下是加载数据窗口数据的多线程方法: 1. 创建子线程:使用 PowerBuilder 的 `Create Thread` 函数创建一个子线程。 2. 在子线程加载数据:在子线程的 `run` 函数加载数据窗口的数据。您可以使用 `dw_1.Retrieve()` 函数来加载数据,也可以使用 `SELECT` 语句从数据库检索数据并将其分配给数据窗口。 3. 在主线程更新数据窗口:在子线程加载数据后,使用 PowerBuilder 的 `Post` 函数将数据传递到主线程。然后在主线程使用 `SetTransObject` 函数将事务对象设置为子线程的事务对象,最后使用 `dw_1.SetRedraw(True)` 函数更新数据窗口并显示数据。 以下是具体的代码实现: ``` // 在打开窗口时创建子线程 u_dw_thread ldw_thread ldw_thread = CREATE u_dw_thread ldw_thread.Start() // 在子线程加载数据 run: dw_1.DataWindowObject = "d_emp" dw_1.SetTransObject(SQLCA) dw_1.Retrieve() // 在主线程更新数据窗口 Post(ldw_thread, dw_1) dw_1.SetTransObject(ldw_thread.SQLCA) dw_1.SetRedraw(True) ``` 在以上示例,`u_dw_thread` 是一个继承自 PowerBuilder `Thread` 类的用户自定义类,用于创建子线程。子线程的 `run` 函数加载数据窗口的数据,并将数据传递到主线程。主线程接收到数据后,将事务对象设置为子线程的事务对象,并更新数据窗口并显示数据。 需要注意的是,使用多线程加载数据窗口的数据需要注意线程安全性和数据一致性。如果多个线程同时操作同一个数据窗口,需要使用 PowerBuilder 的同步机制来保证线程安全性和数据一致性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值