目前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