我正在尝试用两个按钮制作简单的FoxPro应用程序。第一个按钮启动while循环并正常工作。第二个按钮必须打破这个循环。但我找不到任何正确的解决方案。 有循环代码:
DO WHILE !thisForm.cancelpressed
IF thisForm.cancelpressed
EXIT
ENDIF
randNum=VAL(TRIM(STR(ROUND( 3*RAND(), 1))))
&&oneVar=VAL("1")
IF randNum = VAL("1")
ThisForm.shape1.BackColor = greenColor
ThisForm.shape2.BackColor = orangeColor
ThisForm.shape3.BackColor = redColor
ENDIF
cs = seconds()
IF abs(cs - seconds()) >= 15
doevents
cs = seconds()
ENDIF
IF thisForm.cancelpressed
EXIT
ENDIF
DOEVENTS
WAIT TIMEOUT 1
ENDDO
此代码位于第一个按钮Click方法中。表单对象具有用户定义的“cancelpressed”属性。在第二个按钮单击方法我把它:
thisForm.cancelpressed = .T.
Thisform.Release()
Clear Events
但它不起作用。循环启动时,它不想听任何命令和点击,它不会让关闭程序。如果可以,请帮助
答案 0 :(得分:1)
您可以尝试设置
Application.AutoYield = .T.
根据https://msdn.microsoft.com/en-us/library/aa977324(v=vs.71).aspx
但是,如果这不起作用,那么我认为你被困在VFP不是一个真正的多线程应用程序。您可能能够根据http://fox.wikis.com/wc.dll?Wiki~TimerExample使用计时器对象或使用https://blogs.msdn.microsoft.com/calvin_hsia/2006/05/16/create-multiple-threads-from-within-your-application/中的多线程解决方法来解决问题,但您可能非常依赖自己。< / p>
我不得不说今天在VFP中启动一个新应用程序可能不是最好的主意。目前有很多替代品。
答案 1 :(得分:0)
问题在于您的等待窗口。去掉它。
Local greenColor, orangeColor, redColor
m.greenColor = 0x00FF00
m.orangeColor = 0x3060FF
m.redColor = 0xFF0000
Do While !Thisform.cancelpressed
randNum=Val(Trim(Str(Round( 3*Rand(), 1))))
If m.randNum = Val("1")
Thisform.shape1.BackColor = m.greenColor
Thisform.shape2.BackColor = m.orangeColor
Thisform.shape3.BackColor = m.redColor
Endif
Doevents
Enddo
(我不明白为什么你这么奇怪的randNum设置和检查也没有反复设置相同颜色的目的,但这不是这个问题的重点)
通常你应该更喜欢使用带有这样代码的Timer。
而BTW这与VFP和其他语言的多线程无关。你只是做一个带取消标志检查的循环。使用相同的方法更新UI(例如在C#中)将不会更容易。