以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]多线程加队列求助 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=113550) |
-- 作者:ajie5211 -- 发布时间:2018/1/18 9:19:00 -- [求助]多线程加队列求助 查看了很多论坛资料,多线程一直有点迷茫。因历史原因,我们的订单数据非常零散,现在通过后台SQL视图的形式在读取最新订单数据,用openQQ实现数据的同步刷新。因为是后台视图,不能用普通的行重载,追加数据的方式来更新前台数据,用SQLfind找到最新后台数据,与现前台数据对比,更新或加载,发现一人保存时,其它人哪里更新前台会造成窗口假死,啥也操作不了,非常影响操作体验,思考原因,主要是ReceivedMessage 是一条一条执行的,与循环语句一样,这时反复的用SQLfind非常耗费资源,速度变慢。为解决这个问题,就想用多线程来解决这个问题,因为要更新前台表,看论坛一定要用队列。根据论坛例子,我写了如下语句,但发现有压入队列,但队列操作和订单填写没有执行,请帮助修改。 全局代码如下: \'*******订单计划一览表多线程************ Public _MyQueue As Queue(Of System.Data.DataRow) \'定义的表队列 \'定义一个方法,用于线程委托 \'\'\' <summary> \'委托的处理方法 内部函数如下: 取订单后台信息: Dim xsdh As String = Args(0) 队列操作: If Vars("逻辑1") > 0 AndAlso _MyQueue IsNot Nothing AndAlso _MyQueue.Count > 0 Then 订单填写: Dim htdr As System.Data.DataRow =Args(0) 收到来自好友或服务器的信息时触发ReceivedMessage代码如下: Dim msg As String = e.Message end if end if end if end if |
-- 作者:有点甜 -- 发布时间:2018/1/18 9:36:00 -- 你都没有调用,压入队列以后,要弹出和执行操作的,如
If _MyQueue IsNot Nothing AndAlso _MyQueue.Count > 0 Then
如果要循环执行,就这样调用
Vars("逻辑1") += 2 |
-- 作者:ajie5211 -- 发布时间:2018/1/18 11:15:00 -- 以下是引用有点甜在2018/1/18 9:36:00的发言:
你都没有调用,压入队列以后,要弹出和执行操作的,如
If _MyQueue IsNot Nothing AndAlso _MyQueue.Count > 0 Then
如果要循环执行,就这样调用
Vars("逻辑1") += 2 版主别激动,这东西帮助里没有详细说明,又不是科班出身,这个真不懂,还希望把我这颗小草当大树抱。 现在发现收到多条更新信息时,有些条目没有更新过来,是不是ReceivedMessage循环太快,上一个队列还没有执行完,自定义函数取订单后台信息:就把队列给弹出去了?不知道这里要如何修改哪? |
-- 作者:有点甜 -- 发布时间:2018/1/18 11:27:00 -- 压入队列代码有错,不能清空和重新new,试试改成下面
Dim xsdh As String = Args(0) |
-- 作者:ajie5211 -- 发布时间:2018/1/18 12:00:00 -- 发现内部函数“订单填写”新增行时,总出错提示“索引超出范围。必须为非负值并小于集合大小。参数名: index” Dim htdr As System.Data.DataRow =Args(0) |
-- 作者:有点甜 -- 发布时间:2018/1/18 12:03:00 -- 删除这两句看看
Dim wz As Integer = Tables("订单计划一览表").FindRow(ndr) |
-- 作者:ajie5211 -- 发布时间:2018/1/18 16:15:00 -- .NET Framework 版本:2.0.50727.5420 自定义函数取订单后台信息如下 Dim xsdh As String = Args(0) 怎么会有这个错误哪? |
-- 作者:有点甜 -- 发布时间:2018/1/18 17:10:00 -- 删除代码
_TPool.QueueUserWorkItem(New System.Threading.WaitCallback (AddressOf ddd))
开启的代码,在afterOpenProject处理即可
_TPool.QueueUserWorkItem(New System.Threading.WaitCallback (AddressOf ddd)) [此贴子已经被作者于2018/1/18 17:09:55编辑过]
|
-- 作者:ajie5211 -- 发布时间:2018/1/19 9:32:00 -- 报错,或是一直更新不完全,发现队列操作中Threading.Thread.CurrentThread.Sleep(200)这个时间设置的不能短了,短了就容易报错或是信息更新不全,怀疑是上一条订单修改还没有完成,就开始下一个队列了,但是这个设置的太长了,又会更新的很慢。有没有什么办法,等上一条完成了,才开始下一条? 队列操作: If Vars("逻辑1") > 0 AndAlso _MyQueue IsNot Nothing AndAlso _MyQueue.Count > 0 Then |
-- 作者:有点甜 -- 发布时间:2018/1/19 9:35:00 -- 报什么错?上传具体实例测试。 |