Foxtable(狐表)用户栏目专家坐堂 → LIKE疑惑与timerclick带来的卡顿


  共有2733人关注过本帖树形打印复制链接

主题:LIKE疑惑与timerclick带来的卡顿

帅哥哟,离线,有人找我吗?
douglas738888
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1175 积分:8792 威望:0 精华:0 注册:2012/4/18 16:28:00
LIKE疑惑与timerclick带来的卡顿  发帖心情 Post By:2019/5/22 11:20:00 [只看该作者]

请教老师,几个问题请教

问题1 :下面标注颜色的代码,都能实现同样的功能,哪个执行效率高,并且统计负荷小,窗口TimerClick中使用LIKE是否会影响打开项目和窗口的速度?


Dim st019 As WinForm.Label = Forms("主页").Controls("Lab16")
Dim Count019 As Double


Count019 = DataTables("文件").SQLCompute("Count(登记编号)","发送_指定接收人 Like  '%" & _UserName & "%' and (接收确认 Not Like '%" & _UserName & "%' Or 接收确认 Is null) And 发送_完成 = 1 And 接收完成 = 0")
Count019 = DataTables("文件).SQLCompute("Count(登记编号)","发送_指定接收人 = '" & _UserName & "' and (接收确认 <> '" & _UserName & "' Or 接收确认 Is null) And 发送_完成 = 1 And 接收完成 = 0")

st019.Text = "" & Count019 & ""

 

问题2: 窗口里的TimerClick中,写入了如上代码类型,约有20个,计时器启用间隔为5000,窗口中有一个表设置了如下代码,鼠标在表中移动时,每隔5秒就卡顿一次,卡顿时间约3秒,如此反复很难受,把问题1的代码在计划管理中,不使用窗口的TimerClick,也没有改善;同时类似的问题也会影响到窗口中的菜单按钮和Button按钮使用(鼠标经过按钮遇到TimerClick间隔卡顿时,按钮背景不会变色也不会被选取),怎样能改善这个问题?     类似的问题,论坛中也有人提到过。

DrawCell

If e.Table.Name = vars("t") And e.Row.Index = vars("r") Then 
    e.Table.DataTable.AddUserStyle("变色",Color.White,Color.DeepSkyBlue)
    .Style = "变色"
End If

MouseEnterCell

vars("t") = e.Table.Name
vars("t") = Tables("主页_Table1").Name
vars("r") = e.Row.Index
e.Table.Refresh

MouseLeaveCell

vars("t") = Nothing
vars("r") = -1

[此贴子已经被作者于2019/5/22 11:20:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/5/22 11:23:00 [只看该作者]

1、没有多少区别。忽略不计。

 

2、SQLCompute每执行一次,耗时0.5秒,请确认你执行了多少个耗时代码。

 

3、如果需要执行,用异步函数处理一下试试 http://www.foxtable.com/mobilehelp/scr/3269.htm


 回到顶部
帅哥哟,离线,有人找我吗?
douglas738888
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1175 积分:8792 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/5/22 15:56:00 [只看该作者]

谢谢老师的指导,异步编程,看了大概有个了解了,

 

有些不明白,是否是:上述在Timerclick中的代码在内部函数中建立一个函数把代码写过去要用到Sleep,每一个统计值的代码段都要写一次,类似的代码再在Timerclick中写一次,不知我的理解对吗?请老师就上面的实例,指导写个函数的代码,我参考参考学习学习,谢谢!

[此贴子已经被作者于2019/5/22 15:56:52编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/5/22 16:41:00 [只看该作者]

把你timertick事件的代码,写到函数里面,然后在timertick事件,异步调用函数,即可。

 回到顶部
帅哥哟,离线,有人找我吗?
douglas738888
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1175 积分:8792 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/5/23 10:48:00 [只看该作者]

老师我这样写的,不知对吗? 感觉没有明显改善,依然卡顿,卡顿时间约2秒

 

这样的代码段,我数了一下有27个,因为要统计显示多个表的数据,只能一个一个Label来呈现出来,这样的话控件比较多

函数Task:

Dim Count019 As Double
Count019 = DataTables("文件").SQLCompute("Count(登记编号)","发送_指定接收人 = '" & _UserName & "' and (接收确认 <> '" & _UserName & "' Or 接收确认 Is null) And 发送_完成 = 1 And 接收完成 = 0")
Sleep(50) '暂停线程50毫秒
Return  Count019

 

timerclick:

Dim pbx06 As WinForm.PictureBox = Forms("主页").Controls("PictureBox06")
Dim st019 As WinForm.Label = Forms("主页").Controls("Lab16")
Dim Count019 As Double
Count019 = DataTables("文件).SQLCompute("Count(登记编号)","发送_指定接收人 = '" & _UserName & "' and (接收确认 <> '" & _UserName & "' Or 接收确认 Is null) And 发送_完成 = 1 And 接收完成 = 0")
If Count019 = 0 Then
   pbx06.ImageFile = "OK.png" '显示符号
   st019.ForeColor = Color.DimGray 'Gainsboro '字体颜色  
ElseIf Count019 > 0 Then
   pbx06.ImageFile = "NO.png" '显示符号
   st019.ForeColor = Color.Red '字体颜色 
End If
st019.Text = "" & Count019 & ""

Functions.AsyncExecute("Task")

[此贴子已经被作者于2019/5/23 10:53:29编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/5/23 11:57:00 [只看该作者]

操作控件要异步加同步处理:http://www.foxtable.com/mobilehelp/scr/3274.htm

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/5/23 15:16:00 [只看该作者]

把timerclick事件的整段代码,都写到函数里面去处理。

 

如果报错,再加上同步函数 http://www.foxtable.com/mobilehelp/scr/3274.htm

 


 回到顶部
帅哥哟,离线,有人找我吗?
douglas738888
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1175 积分:8792 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/6/10 15:57:00 [只看该作者]

请教老师,我把TimerTick的全部代码都写到函数里面了,28个代码段,每个代码代码段都设了不同的

Sleep(20)

Return count1

 

TimerTick  里只写了这句代码

Functions.AsyncExecute("Task")

 

打开窗口正常,不同的统计值都正常,也不会出现时间间隔的断点影响,但是在本窗口Label点击打开另外窗口时(加载SQLTable)时报错,无效操作,连接被关闭........,无法加载表到窗口

 

这是什么问题,也不知道如何设置这样的同步函数,看了帮助也没弄懂,是否是异步函数执行时,其他主线程是被禁止使用的(如果不使用异步函数,加载表是正常的)


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/6/10 16:12:00 [只看该作者]

点击打开另外的窗口,执行了什么代码?在哪里执行?

 

做一个对应的项目发上来测试。

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
douglas738888
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1175 积分:8792 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/6/10 16:19:00 [只看该作者]

5楼的代码

Dim st019 As WinForm.Label = Forms("主页").Controls("Lab16")

Dim Count019 As Double
Count019 = DataTables("文件).SQLCompute("Count(登记编号)","发送_指定接收人 = '" & _UserName & "' and (接收确认 <> '" & _UserName & "' Or 接收确认 Is null) And 发送_完成 = 1 And 接收完成 = 0")
If Count019 = 0 Then
   pbx06.ImageFile = "OK.png" '显示符号
   st019.ForeColor = Color.DimGray 'Gainsboro '字体颜色  
ElseIf Count019 > 0 Then
   pbx06.ImageFile = "NO.png" '显示符号
   st019.ForeColor = Color.Red '字体颜色 
End If
st019.Text = "" & Count019 & ""

 

比如:当st019.Text  = 1  有文件提示时,点击此控件

此控件的Click:

 

Forms("窗口2").Open
DataTables("窗口2_Table1").LoadFilter = "未阅读 = 0"
DataTables("窗口2_Table1").Load()


 回到顶部
总数 18 1 2 下一页