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


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

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

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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望: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编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望: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编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望: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编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望: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)时报错,无效操作,连接被关闭........,无法加载表到窗口

 

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


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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望: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()


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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/6/11 15:59:00 [显示全部帖子]

请老师看看这个异步编程实例,连接ACCESS数据源,

测试窗口:窗口1

 

使用ACCESS数据源,直接就报错,  使用SQLSERVER云服务器的,是在TimerTick每次间隔的地方如果点击才报错,不在间隔点上不会报错

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:异步编程测试.rar


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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/6/11 17:18:00 [显示全部帖子]

老师,我这边依然再报错,就是在时间间隔点上,如果时间间隔为6000,如果刚好这个点上点击打开另外窗口就报错,不在这个点上不报错,请老师再试试

我在TimerTick加入MessageBox.Show("到点"),每隔6秒跳出,点击确认后,在点击Lab1都不会报错,如果MessageBox显示窗口马上点击确认,立即点击Lab1就报错(因为刚好在间隔点上)

 

 修改后的连接


图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看

 

在间隔点上点击报错
 


图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看
点击确认报错

 


图片点击可在新窗口打开查看此主题相关图片如下:3.jpg
图片点击可在新窗口打开查看

 

后续关闭所有窗口也报错,都是未引用实例等等

[此贴子已经被作者于2019/6/11 17:28:36编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1172 积分:8772 威望:0 精华:0 注册:2012/4/18 16:28:00
  发帖心情 Post By:2019/6/12 10:03:00 [显示全部帖子]

谢谢蓝老师指导,但是有几个问题还得请教,

1. 蓝老师指导的代码好像都是在主线程完成Functions.Execute,没有用到Functions.AsyncExecute,根据帮助说明,这样的实例是否就不能用异步函数?

2. 如果不用Functions.AsyncExecute,操作其他控件卡顿比较明显,蓝老师指导的代码应用时,通过实例中的多个按钮鼠标经过时变色来测试,就出现明显的卡顿;

    如果这个窗口中还有Panel或Table控件,使用滚动条的时候,移动滚动条时刚好在TimerTick的间隔点上,也同样出现卡顿

3.目前实例中就存在两个主要问题:

   3.1 异步函数:用Functions.AsyncExecute,鼠标经过按钮时变色不会卡顿,Panel或Table使用滚动条的时候不卡顿,但TimerTick时间间隔点上打开其他窗口加载表报错

   3.2 同步函数:用Functions.Execute,鼠标经过按钮时变色会卡顿,Panel或Table使用滚动条的时候会卡顿,但TimerTick时间间隔点上打开其他窗口加载表正常,不受影响

 

这样的情况怎样解决,麻烦老师们再指教指教,谢谢!!

 

 


 回到顶部