问题描述
我用一个单独线程通过control.invoke修改tabpag2中的控件,tabcontrol默认显示page1,如果invoke之前点击过tabpage2,一切正常而如果主窗口打开后我什麽也不干,则整个ui在单独线程执行到invoke后就卡死了请问这是为什么啊?
解决方案
解决方案二:
因为里面其实还什么都没有
解决方案三:
invoke是同步方式改成begininvork试试
解决方案四:
主菜单分析->性能诊断->按你的说法让它卡死一会,然后看分析报告,最长的那一条一般是卡死的原因如果你帖出来invoke里干了什么也许能更容易分析一些
解决方案五:
引用1楼Z65443344的回复:
因为里面其实还什么都没有
什么叫有和没有呢?
解决方案六:
引用3楼phommy的回复:
主菜单分析->性能诊断->按你的说法让它卡死一会,然后看分析报告,最长的那一条一般是卡死的原因如果你帖出来invoke里干了什么也许能更容易分析一些
比如这个privatevoidSetImageIndexTreeNode(TreeNodetn,intindex){if(tn.TreeView.InvokeRequired){SetImageIndexTreeNodeCallBackcb=SetImageIndexTreeNode;Invoke(cb,newobject[]{tn,index});}else{tn.ImageIndex=index;tn.SelectedImageIndex=index;}}
解决方案七:
就是说,tabpage里的控件只存在于后台,根本还没有绘制进tabpage里去
解决方案八:
你可以试试获取tabpage2的宽和高,保证是0,0
解决方案九:
如果你的tabpage只是用来显示数据,而且很多时候它根本都不显示,那么就不应该在线程里直接对UI进行操作,这样没有意义你应该将线程产生的数据先写入全局变量里,然后在timer里定时更新,这时候可以判断当前显示的是哪个page,不显示的根本不去更新它
解决方案十:
引用2楼Z65443344的回复:
invoke是同步方式改成begininvork试试
引用6楼Z65443344的回复:
就是说,tabpage里的控件只存在于后台,根本还没有绘制进tabpage里去
控件只有绘制了才能算是存在吗?怎么感觉应该是一直在那里,绘制只是显示一个画面而已
解决方案十一:
引用8楼Z65443344的回复:
如果你的tabpage只是用来显示数据,而且很多时候它根本都不显示,那么就不应该在线程里直接对UI进行操作,这样没有意义你应该将线程产生的数据先写入全局变量里,然后在timer里定时更新,这时候可以判断当前显示的是哪个page,不显示的根本不去更新它
不实时跟新的话,在tab切换的时候又会很麻烦啊。
解决方案十二:
所谓"实时"什么是实时?从线程产生数据,到invork更新到界面上,还有时间差呢反正就是人眼看,更新的再快看的清楚?用个timer每秒更新一次足够看了.嫌慢100ms更新一次
解决方案十三:
引用11楼Z65443344的回复:
所谓"实时"什么是实时?从线程产生数据,到invork更新到界面上,还有时间差呢反正就是人眼看,更新的再快看的清楚?用个timer每秒更新一次足够看了.嫌慢100ms更新一次
需要判断2次的区别,不少控件会挺麻烦啊另外,按我这么做的话,怎样强制先绘制后台控件呢?
解决方案十四:
代码让page切换一下
解决方案十五:
而且你要改为在timer里更新控件的text,根本不需要判断它是否有改变,无脑网上赋值就行因为控件的text属性里set函数本身已经对值是否改变进行了校验,如果不变就不赋值,当然也不会引发控件刷新