Foxtable(狐表)用户栏目专家坐堂 → [求助]多线程的问题


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

主题:[求助]多线程的问题

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


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

回到计算问题,请用异步函数执行sql语句,用异步函数处理得到的数据,然后再写入你的后台表,或者前台表,即可。

 

如果写入后台表出错,请贴出出错信息。如果写入前台表出错,请改用同步函数执行写入的操作。


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


加好友 发短信
等级:九尾狐 帖子:2195 积分:18043 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/3/14 21:46:00 [只看该作者]

甜版主看看这样可行否?
在全局代码中定义一个线程“XC001”
Public Sub XC001(ByVal cr As Object,ByVal s As Object)
    functions.Execute("JS01", r)
End Sub

Public Sub XC002(ByVal cr As Object,ByVal s As Object)
    functions.Execute("JS02", r)
End Sub

再定义两个表
public DTA as datatable
public DTB as datatable

然后在自定义函数中定义一个函数“JS01”
dim r as row = args(0)
dim s as integer = args(1)
dim dt as datatable
c m d . C o n n e c t i o n N a m e   =   " 外部数据库连接名 "
cmd.CommandText = "计算表DTA的SQL语句"
dtA = cmd.ExecuteReader()

然后在自定义函数中定义一个函数“JS02”
dim r as row = args(0)
dim s as integer = args(1)
dim dt as datatable
c m d . C o n n e c t i o n N a m e   =   " 外部数据库连接名 "
cmd.CommandText = "计算表DTB的SQL语句"
dtB = cmd.ExecuteReader()

在命令窗口开启多线程计算
dim r as row = tables("XXX").rows(0)
dim s1 as integer = 1
vars("数量A计算完成")  = false
Dim t1 As Threading.Thread =  New Threading.Thread(AddressOf XC001)
t1.Start(r,s1)
vars("数量1计算完成")  = true

'同理计算数量2
dim s2 as integer = 2
vars("数量B计算完成")  = false
Dim t2 As Threading.Thread =  New Threading.Thread(AddressOf XC002)
t2.Start(r,s2)
vars("数量2计算完成")  = true

if vars("数量1") = true andalso vars("数量2") = true  then 
'执行代码,因为这段代码要利用数量1和数量2的计算结果
end if 
[此贴子已经被作者于2019/3/14 21:48:01编辑过]

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


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

1、这种代码,要写到函数里面去,不能写在函数外面

 

vars("数量2计算完成")  = true

 

2、你现在是执行sql语句慢?还是赋值代码慢?慢的那些,才需要用多线程处理。


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


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

 

比如我要执行100个sql语句插入输入,那就循环开启100个线程去执行。

 


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


加好友 发短信
等级:九尾狐 帖子:2195 积分:18043 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/3/15 8:05:00 [只看该作者]

单个sql执行比较快,一个近2秒,但是执行的sql多了(现在是5个),如果依次执行,那就用时长 。另外,执行完5个sql以后,形成5个表,这5个表如果依次给界面表赋值就更慢,1万行单列赋值近1秒,如果5万行赋值至少4秒,5个表不得20秒去了

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


加好友 发短信
等级:九尾狐 帖子:2195 积分:18043 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/3/15 8:09:00 [只看该作者]

以前蓝版主给了个思路,这5万行可以考虑分成5组用异步函数执行sql

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


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

用异步函数赋值啊。比如

 

比如要执行10000个sql语句插入输入,那就循环开启10000个线程去执行。

 


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


加好友 发短信
等级:九尾狐 帖子:2195 积分:18043 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/3/15 14:00:00 [只看该作者]

不行吧。帮助里写了,界面表不能在异步函数中调用啊

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


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

以下是引用chnfo在2019/3/15 14:00:00的发言:
不行吧。帮助里写了,界面表不能在异步函数中调用啊

 

那你就改成后台数据库啊,给后台数据表赋值啊。


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


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

 

测试了一下,你这种功能,是无法优化的了。你最终都要涉及到给表格控件赋值,而赋值注定是比较慢才能完成的。即便通过sql语句给后台赋值也很慢。

 

只能是改变你的计算思路,不要每次都重新计算一次。

 

 


 回到顶部
总数 59 上一页 1 2 3 4 5 6 下一页