当前位置: 代码迷 >> PB >> pb进度条有关问题
  详细解决方案

pb进度条有关问题

热度:112   发布时间:2016-04-29 05:35:07.0
pb进度条问题
目前pb程序中自己做的的进度条(百分比进度条和文本进度条)都属于单进程进度条,在进度条执行过程中如果切换到别的界面在切换回程序时,进度条和整个程序界面会卡死,但后台程序仍在执行,麻烦问下各路高手有没有好的解决办法。
------解决方案--------------------
PB有共享对象,可以实现多线程的功能  

2009-08-28 10:55:53
------解决方案--------------------
  分类: PB 
------解决方案--------------------
字号 订阅
当用进度条显示长时间统计进度的时候,请问:pb中怎么实现多个线程如工作线程和界面线程分开,能在系统统计的时候仍旧能编辑响应界面中的消息事件如:取消 按钮,或编辑拷贝统计中实时写入的告警信息等等!

 

PB有共享对象,可以实现多线程的功能.

以下的内容是转载的,看明白大概意思自己做吧,

看不明白的地方再讨论。

===========================================

PB目前版本暂时还不支持多线程开发,多线程是指一个程序内部同时执行的多个流程﹐与单线程相比﹐它至少有两个方面的优点﹕第一﹐它可以更好地利用系统资源﹐比如CPU﹐若一个线程因I/O操作受阻﹐另一个线程仍可利用CPU来执行﹔第二﹐它更好地满足了客户的需求﹐因为挑剔的客户希望你开发的程序在显示动画的同时还能播放音乐﹑显示文件﹑下载网络文件等﹐这是单线程应用程序无法完成的。目前﹐支持多线程的开发工具主要有﹕Java﹑VC﹑Delphi和C++Builder。     

   

    多线程强调的是一个进程内部有多个流程在同时执行﹐同时执行的概念相当于PB分布式计算中的异步处理。也就是说﹐只要我们在一个程序内部实现了异步处理﹐就相当于实现了多线程。分析至此﹐下一步该怎幺做就不言而喻了﹕在一个应用程序内部实现分布式计算﹐使用服务器推送技朮﹐异步执行共享对象中的函数。     

   

    下面就编写一个Demo﹐介绍在PB中如何利用分布式计算技朮来开发多线程应用程序﹐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。     

    主窗口接收到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     

  设的三个控件分别为﹕st─thread1﹑st─thread2﹑st─time﹐分别用于显示uo─thread1和uo─thread2中自加变量的当前瞬间值和系统时间。声明两个用户事件﹕ue─thread1和ue─thread2﹐分别用于对中间对象发送来的ue─thread1和ue─thread2消息进行响应。ue─thread1事件处理代码为﹕     

    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     
  相关解决方案