C# 跨线程调用窗体控件 225

在一个Timer_Tick中触发电子眼检测后,在判断为真时可以执行Read()的方法,不能阻塞电子眼的检测过程(当调用执行Read()后,再回到电子眼判断已经跟不上电子眼... 在一个Timer_Tick中触发电子眼检测后,在判断为真时可以执行Read()的方法,不能阻塞电子眼的检测过程(当调用执行Read()后,再回到电子眼判断已经跟不上电子眼触发速度或出现电子眼触发计数比实际触发要少)。要求经判断后能够运行Read方法调用控件DataGridView ,并且电子眼触发判断程序一定要不受阻塞(包括显示在窗体上Label的电子眼触发计数也要准确跟上实际电子眼触发的计数)。如果能完美解决可以追加悬赏 展开
 我来答
百度网友d242235
2017-07-13 · TA获得超过2385个赞
知道大有可为答主
回答量:1403
采纳率:84%
帮助的人:814万
展开全部

Read()函数性能太低了,阻塞了电子眼触发函数,你需要转变下思路,使用异步队列来处理电子眼数据与UI之间的同步。即:

  1. DI_Tick把电子眼数据存储tagReads[]存储到异步队列中

  2. 新建一个线程轮询异步队列,如果有数据则使用MethodInvoker跨线程绑定UI,之后从队列移除这部分数据。

你现在的代码,电子眼收听函数DI_Tick是运行在UI线程的,这就造成了一旦UI线程忙碌,则你的电子眼收听就阻塞了,所以需要使用一个异步队列,把UI的更新和电子眼的数据接收两部分工作隔离开来。

追问
大概思路我也知道,但是实现方法方面具体是怎样的。我现在就是一直在找适合用的方法,能否示范下,谢谢。
三天打鱼N
2017-07-13 · TA获得超过1540个赞
知道大有可为答主
回答量:2032
采纳率:74%
帮助的人:591万
展开全部
把表格放到其他窗口 窗口另用一个线程
还有就是那个读取的方法没必要每次触发读取一次吧 如果间隔比较短只读取一次就好了吧
追问
..
追答

20毫秒读一次 那也可以先把数据存起来 再等待一段时间 把数据添加到表格。 表格的功能是给人看的 刷新快了也没意义 看不清

还有就是 在表格添加数据之前 先比较一下 如果跟上一次的数据相同就 不用更新表格 或者 单元格

我上面说了 可以把表格放到其他的窗口 窗口单独用一个线程 应该就不会堵塞当前的线程了

// http://pan.baidu.com/s/1c2u4XKO

简单的写了一下

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2017-07-12 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7733万
展开全部
20ms的时间估计更新界面有点悬 太频繁
更多追问追答
追问
20并不是更新界面,而是读取某个值的间隔。
追答
把你现有正常工作(除了性能外,可以正常读取和更新界面)的代码发来改改
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
玩转数据处理
2017-07-12 · 数据处理,Python,dotnet
玩转数据处理
采纳数:1613 获赞数:3794

向TA提问 私信TA
展开全部
去学下BackgroundWorker怎麼用,这个可以跨线程调用控件
更多追问追答
追问
跨线程调用是远远不够的,我用MethodInvoker早已实现,问题是如何才能保证程序运行不会拖慢电子眼的触发。
追答
有没有其他不用电子眼这样的描述来描述你的需求呢,电子眼这东西还真不知道干啥的。多线程异步调用?或是给个实例展现你的问题也可以。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
偶蔼程豫
2019-10-25 · TA获得超过3846个赞
知道大有可为答主
回答量:3118
采纳率:33%
帮助的人:241万
展开全部
你在构造函数里加上这个:
CheckForIllegalCrossThreadCalls
=
false;
这样可以关闭.net的控件夸线程访问检查。其实你这个错误只是在VS里调试的时候出现,如果你直接双击你编译后.exe程序来运行,会发现不会出现这个错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式