| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 371 人关注过本帖
标题:如果循环执行一段代码期间触发了Timer控件的代码,会不会影响原有循环代码的 ...
只看楼主 加入收藏
asis
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:7
注 册:2022-9-6
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:6 
如果循环执行一段代码期间触发了Timer控件的代码,会不会影响原有循环代码的执行?
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编辑过]

搜索更多相关主题的帖子: 循环 代码 Timer 控件 执行 
2024-04-30 11:44
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:276
专家分:615
注 册:2014-6-12
收藏
得分:10 
多个timer工作,互不干扰
他们是单线程工作,VFP的活儿是一个一个干的
你需要注意的是:timer工作时的表名和当前工作区,工作之前记录工作区,干完活儿,把工作区在指定回原来的


2024-04-30 12:01
asis
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:7
注 册:2022-9-6
收藏
得分:0 
主程序是一个死循环,直到按ESC键退出:
do while .t.
***中间有很多语句
***
enddo

现在是在循环显示过程中有些显示的汇总数据不正常,不知道是否与这个循环执行中触发了TIMER控件有关?
2024-04-30 12:21
shizi0
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:131
专家分:409
注 册:2012-10-2
收藏
得分:5 
二楼说的很明白,关键是主程序有可能中间不确定哪行就会暂停,转去执行Timer,完了再接着执行下一行。
所以timer尤其要注意“封装”好,不要干扰了主程序的变量、工作区、当前记录号等等环境因素,这些处理好了,不会有问题。

2024-04-30 12:44
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:276
专家分:615
注 册:2014-6-12
收藏
得分:0 
以下是引用asis在2024-4-30 12:21:45的发言:

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

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

每次执行过程都是单一的,不会出现2个过程同时执行的情况。
你说的可能是工作区、别名、变量混乱导致的,也就是:每个过程干完活儿,把之前的工作区或变量等改变导致的
2024-04-30 13:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:5 
timer用的是“定时器”,定时器不定时,消息优先级较低。
要看循环体内具体在做什么,timer有可能在循环结束后才有效,在循环体内时段甚至有失效的可能。

2024-04-30 15:15
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
个人见解,纯属猜测
在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编辑过]

2024-05-04 07:22
快速回复:如果循环执行一段代码期间触发了Timer控件的代码,会不会影响原有循环 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019326 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved