HITSY 版 (精华区)
发信人: lyfe (修身养性), 信区: HITSY
标 题: Pb中Yield()函数的使用(转载)
发信站: 哈工大紫丁香 (2002年04月06日13:22:05 星期六), 站内信件
【 以下文字转载自 Database 讨论区 】
【 原文由 mengy 所发表 】
Pb中Yield()函数的使用
Yield()函数是一个在PB程序控制中非常有用的函数,如果能够合理使用它,
一定可使你的程序操作友好很多。Yield()函数的功能是将控制权转移给其它图形
对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取
出。
该函数返回布尔型值,如果在消息队列中提取到了消息,那么函数返回TRUE,
否则返回FALSE。。利用该函数可以在执行耗时较长的操作时把控制权转让给其它
应用。用法正常情况下,PowerBuilder应用程序在执行一段代码(比如正在检索数
据或者执行一段循环程序)的过程中不响应用户的操作。对耗时短暂的代码段来说
,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长(比
如在大量数据检索或循环执行的代码中),应用程序又希望为用户提供更多的控制
权,那么需要在这段代码中插入Yield()函数,让用户能够进行其它操作,比如,
允许用户按下其他窗口的“取消”按扭,而该按扭又改变了某个全局(共享)变量
,在Yield()函数接下来的代码中便可判断该全局(共享)变量的值,以决定下一
步的操作。应用程序执行Yield()函数后,如果发现消息队列中存在消息,它将允
许对象处理这些消息,处理之后,继续Yield()函数后面代码的执行。
虽然用户在检索时不能做其他的事情,但是当你将Yield()函数放在
RetrieveRow事件中时,用户能够同时运行其他的应用程序。当然,代码中插入
Yield()函数将降低应用程序的运行效率。
示例1.
下面的代码执行一段耗时较长的过程,在其中我们插入了Yield()函数,当用户单
击窗口上的“取消”按钮时,终止这段代码的执行,其中使用共享变量
sb_interrupt来指示用户是否单击了“取消”按钮:
integer n
// sb_interrupt是共享变量
sb_interrupt = FALSE
FOR n = 1 to 3000
Yield()
IF sb_interrupt THEN
// sb_interrupt的值在“取消”按钮的Clicked事件处理程序中修改
MessageBox("调试","用户中断!")
sb_interrupt = FALSE
EXIT
ELSE
... // 其它处理
END IF
NEXT
“取消”按钮的Clicked事件处理程序可以写为:sb_interrupt = TRUE
示例2.
在本例当中,程序在交互控制第二个窗口同时可以处理第一个窗口的事件。如果没
有Yield()函数,用户也可以控制第二个窗口,但在循环完成之前不能看到窗口焦
点的变化。
integer n
FOR n = 1 to 3000
Yield()
... // Some processing
NEXT
示例3.
In this example, a script wants to open a DDE channel with Lotus Notes,
whose
executable name is stored in the variable mailprogram. If the program
isn't
running, the script starts it and loops, waiting until the program's
startup is
finished and it can establish a DDE channel. The loop includes Yield, so
that
the computer can spend time actually starting the other program:
time starttime
long hndl
SetPointer(HourGlass!)
//Try to establish a handle; SendMail is the topic.
hndl = OpenChannel("Notes","SendMail")
//If the program is not running, start it
IF hndl < 1 then
Run(mailprogram, Minimized!)
starttime = Now()
// Wait up to 2 minutes for Notes to load
// and the user to log on.
DO
//Yield control occasionally.
Yield()
//Is Notes active yet?
hndl = OpenChannel("Notes","SendMail")
// If Notes is active.
IF hndl > 0 THEN EXIT
LOOP Until SecondsAfter(StartTime,Now()) > 120
// If 2 minutes pass without opening a channel
IF hndl < 1 THEN
MessageBox("Error", &
"Can't start Notes.", StopSign!)
SetPointer(Arrow!)
RETURN
END IF
END IF
Panya编译
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: 202.118.226.245]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.878毫秒