注册 登录
编程论坛 VFP论坛

如果循环执行一段代码期间触发了Timer控件的代码,会不会影响原有循环代码的执行?

asis 发布于 2024-04-30 11:44, 363 次点击
1.表单是一个循环显示一些数据,这里面有很多从SQL表读取数据并进行处理后显示的语句,直到按下ESC键才退出循环。
2.表单还有一个timer控件,功能是每隔20秒从SQL表读取当天的日志数据并刷新表单上的操作日志表格

 [问题是]:如果在循环显示过程中,触发了timer控件的timer事件中的代码,是否会影响到原来正在执行的循环语句的正确性?
             还有就是如果一个表单中有多个timer控件,它们之间是否会互相干扰?

***timer控件的timer事件代码如下(每隔20秒触发一次):
if hour(DATETIME())>6 .and. hour(DATETIME())<22  &&从早7点到晚上22点之前刷新滚动日志,在此之外的时间不刷新日志
HG8=DATE()
XINTH1=STRTRAN(dtoc(HG8),'.','-')+' 00:00:00'
XINTH2=STRTRAN(dtoc(HG8),'.','-')+' 23:59:00'
thisform.grdpgk.RecordSource=''
if SQLEXEC(CON,"SELECT 操作员,日期,星期,动作,类别 FROM GYJL WHERE 日期 BETWEEN ?XINTH1 AND ?XINTH2 ORDER BY ID DESC","PJL")>0
with thisform.grdpgk
.RecordSource="PJL"
.column2.controlsource="操作员"
.column4.controlsource="星期"
.column6.controlsource="动作"
.column7.controlsource="类别"
.column9.controlsource="日期"
ENDWITH
GO TOP
Thisform.grdpgk.refresh
ENDIF
endif

显示界面:
只有本站会员才能查看附件,请 登录




[此贴子已经被作者于2024-4-30 11:48编辑过]

6 回复
#2
kangss2024-04-30 12:01
多个timer工作,互不干扰
他们是单线程工作,VFP的活儿是一个一个干的
你需要注意的是:timer工作时的表名和当前工作区,工作之前记录工作区,干完活儿,把工作区在指定回原来的


#3
asis2024-04-30 12:21
主程序是一个死循环,直到按ESC键退出:
do while .t.
***中间有很多语句
***
enddo

现在是在循环显示过程中有些显示的汇总数据不正常,不知道是否与这个循环执行中触发了TIMER控件有关?
#4
shizi02024-04-30 12:44
二楼说的很明白,关键是主程序有可能中间不确定哪行就会暂停,转去执行Timer,完了再接着执行下一行。
所以timer尤其要注意“封装”好,不要干扰了主程序的变量、工作区、当前记录号等等环境因素,这些处理好了,不会有问题。

#5
kangss2024-04-30 13:46
以下是引用asis在2024-4-30 12:21:45的发言:

主程序是一个死循环,直到按ESC键退出:
do while .t.
***中间有很多语句
***
enddo

现在是在循环显示过程中有些显示的汇总数据不正常,不知道是否与这个循环执行中触发了TIMER控件有关?

每次执行过程都是单一的,不会出现2个过程同时执行的情况。
你说的可能是工作区、别名、变量混乱导致的,也就是:每个过程干完活儿,把之前的工作区或变量等改变导致的
#6
吹水佬2024-04-30 15:15
timer用的是“定时器”,定时器不定时,消息优先级较低。
要看循环体内具体在做什么,timer有可能在循环结束后才有效,在循环体内时段甚至有失效的可能。

#7
sych2024-05-04 07:22
个人见解,纯属猜测
在VFP中是以一个函数、一个事件、方法为整体运行的,中间不会交出控制权,除非在这中间有用户交互命令如鼠标、键盘检测inkey等命令例外
oform1=NEWOBJECT("form1")
oform1.Show
READ even
RETURN

DEFINE CLASS form1 AS form

    Caption = "Form1"
    Name = "Form1"

    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 120, ;
        Left = 192, ;
        Height = 25, ;
        Width = 60, ;
        Caption = "Command1"

    ADD OBJECT timer1 AS timer WITH ;
        Top = 72, ;
        Left = 96, ;
        Height = 23, ;
        Width = 23, ;
        Interval = 1000

    PROCEDURE command1.Click
        this.Caption ="停止"
        i=1
        DO whil .t.
            IF INKEY(5)=32  &&可以切换到下一条命令试试,看看标题是否变化
*            IF i>10^8
                EXIT
            endif
            i=i+1
        ENDDO
        this.Caption ="开始"
        CLEAR EVENTS
    ENDPROC

    PROCEDURE timer1.Timer
        thisform.Caption =TRANSFORM(SECONDS())
    ENDPROC

ENDDEFINE


[此贴子已经被作者于2024-5-4 07:30编辑过]

1