button的显示问题

问题描述

我做的winform程序,窗口里有5个数字按扭。在点击一个控制按扭之后,想让5个数字按扭依次消失,再重新显示出来。每两个按扭之间有一个延时。消失没有问题,可是重新显示的时候,按扭不是依次显示的,而且等待了很久,一下全部显示出来...一下是部分代码,求大神指点!多谢~privatevoidbutton25_Click(objectsender,EventArgse){for(inti=0;i<N;i++){this.Controls[5*i+4].Visible=false;Thread.Sleep(200);}for(inti=0;i<N;i++){this.Controls[5*i+4].Visible=true;Thread.Sleep(200);}}

解决方案

解决方案二:
你占用主线程的操作必须结束,不能让你那几行代码就把人家cpu给死循环了。学学使用定时器。
解决方案三:
能不能麻烦讲具体点...为什么第一个循环可以,而第二个循环不行?
解决方案四:
加上一个application.doevents()在循环里面
解决方案五:
Visible=false本来就是当时就隐藏的,因为简单地进行界面刷新就行了,不用主线程进行计算。但是Visible=true则不行。要想让控件很好地显示,并且不影响用户体验,那么要异步编程。要让主线程能够空闲地去处理windows消息。例如要轮流显示Label1、Label2,可以写privatevoidbutton1_Click(objectsender,EventArgse){this.label1.Visible=false;this.label2.Visible=false;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel1);},null,3000,0);}privatevoidShowLabel1(){this.label1.Visible=true;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel2);},null,3000,0);}privatevoidShowLabel2(){this.label1.Visible=false;this.label2.Visible=true;}

它们是异步操作的。你的主线程可以去处理其它千万行代码,而不是在你的那几行代码上死循环。
解决方案六:
要让界面比较流畅地响应用户视觉要求和鼠标键盘操作,那么就要让你的主线程尽快地空闲。绝不能写出死循环的所谓的“监控”程序。这种监控其实就是导致“死”的结果。要让主线程空闲,这是一个基本概念。系统与用户交互,这是一个过程的起点和终点,你必须及时释放你的程序、不占用主线程,才能保证交互。你应该学会用这种基于事件的逻辑方式来设计windows下的交互程序。
解决方案七:
在.net下除非不得已,尽量不要使用Application.DoEvent(并且它也只适合winform,不适合wpf等)。它是用来移植vb6程序的。在15年前的vb中使用这种方式,跟后来出现的.net的处理方式完全不同。它是单线程的,并且它实际上很容易让windows消息泵提前执行而产生响应用户操作时的恶性循环(你看不到的windows消息如滚雪球般地越来越多,而你什么也看不见,只能感觉到电脑越来越卡)。在.net下,应该写多线程的程序。合理延迟显示(而不是提前显示),充分利用你的cpu,特别是多核cpu。用异步编程方式,而不要使用Application.DoEvent。在.net的机制下,你可以看到所有注册给主线程的UI操作都是排着队列自动被调用的。是在你的代码结束之后,主线程空闲时才自动执行的。而Application.DoEvent本身是单线程的,而且它是提前强行执行原本在后边的windows消息泵的机制。这就相当于.net方式是一个“有秩序地轨道交通”,自定义程序总是尽快地让出主线程来,都强调让主线程去调度;而DoEvent模式则是一个“随时将等在很远以外的其它列车强插到当前位置”的操作,windows消息泵被执行时本身就会又去带进来更多的消息,这就形成了恶性循环。并且它也是一直霸占主线程的。
解决方案八:
引用4楼sp1234的回复:

Visible=false本来就是当时就隐藏的,因为简单地进行界面刷新就行了,不用主线程进行计算。但是Visible=true则不行。要想让控件很好地显示,并且不影响用户体验,那么要异步编程。要让主线程能够空闲地去处理windows消息。例如要轮流显示Label1、Label2,可以写privatevoidbutton1_Click(objectsender,EventArgse){this.label1.Visible=false;this.label2.Visible=false;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel1);},null,3000,0);}privatevoidShowLabel1(){this.label1.Visible=true;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel2);},null,3000,0);}privatevoidShowLabel2(){this.label1.Visible=false;this.label2.Visible=true;}

它们是异步操作的。你的主线程可以去处理其它千万行代码,而不是在你的那几行代码上死循环。

非常感谢!明白了。
解决方案九:
引用4楼sp1234的回复:

Visible=false本来就是当时就隐藏的,因为简单地进行界面刷新就行了,不用主线程进行计算。但是Visible=true则不行。要想让控件很好地显示,并且不影响用户体验,那么要异步编程。要让主线程能够空闲地去处理windows消息。例如要轮流显示Label1、Label2,可以写privatevoidbutton1_Click(objectsender,EventArgse){this.label1.Visible=false;this.label2.Visible=false;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel1);},null,3000,0);}privatevoidShowLabel1(){this.label1.Visible=true;newSystem.Threading.Timer(x=>{this.BeginInvoke((Action)ShowLabel2);},null,3000,0);}privatevoidShowLabel2(){this.label1.Visible=false;this.label2.Visible=true;}

它们是异步操作的。你的主线程可以去处理其它千万行代码,而不是在你的那几行代码上死循环。

可不可以这么理解,Visible=false时,只需界面刷新,没有UI改变的命令需要等待主线程处理;Visible=true时,UI改变的命令被存储到队列中,等待Click事件结束后,这些命令才被主线程处理,所以按钮是一起显示的,没有延时。
解决方案十:
你的UI就是你的主线程,你在里面Sleep将造成UI线程阻塞,你的每个Sleep是循环进行的,循环体内只有一个改变显示属性的操作,几乎没有给你停歇的时间,等于是连续阻塞,UI一直得不到响应,只有等离开循环UI才会恢复,给你假象就类似于一起显示了。而你说的你的第一个循环没问题,那是不可能的,肯定阻塞的,你可能仅仅是凭的感觉,你可以将Sleep放大一点,再拖动窗体看看。
解决方案十一:
引用9楼ajianchina的回复:

你的UI就是你的主线程,你在里面Sleep将造成UI线程阻塞,你的每个Sleep是循环进行的,循环体内只有一个改变显示属性的操作,几乎没有给你停歇的时间,等于是连续阻塞,UI一直得不到响应,只有等离开循环UI才会恢复,给你假象就类似于一起显示了。而你说的你的第一个循环没问题,那是不可能的,肯定阻塞的,你可能仅仅是凭的感觉,你可以将Sleep放大一点,再拖动窗体看看。

第一个循环拖动窗体确实会有阻塞,但是按钮确实是依次、有延时的消失的。所以是先处理了显示属性的操作,再进行的睡眠?可是如果从第二个循环来看的话,是等到整个循环结束,退出Click事件之后,显示属性的操作才得到了执行。
解决方案十二:
引用6楼sp1234的回复:

在.net下除非不得已,尽量不要使用Application.DoEvent(并且它也只适合winform,不适合wpf等)。它是用来移植vb6程序的。在15年前的vb中使用这种方式,跟后来出现的.net的处理方式完全不同。它是单线程的,并且它实际上很容易让windows消息泵提前执行而产生响应用户操作时的恶性循环(你看不到的windows消息如滚雪球般地越来越多,而你什么也看不见,只能感觉到电脑越来越卡)。在.net下,应该写多线程的程序。合理延迟显示(而不是提前显示),充分利用你的cpu,特别是多核cpu。用异步编程方式,而不要使用Application.DoEvent。在.net的机制下,你可以看到所有注册给主线程的UI操作都是排着队列自动被调用的。是在你的代码结束之后,主线程空闲时才自动执行的。而Application.DoEvent本身是单线程的,而且它是提前强行执行原本在后边的windows消息泵的机制。这就相当于.net方式是一个“有秩序地轨道交通”,自定义程序总是尽快地让出主线程来,都强调让主线程去调度;而DoEvent模式则是一个“随时将等在很远以外的其它列车强插到当前位置”的操作,windows消息泵被执行时本身就会又去带进来更多的消息,这就形成了恶性循环。并且它也是一直霸占主线程的。

答的真详细!
解决方案十三:
不用Thread.Sleep,用Delay试试。下面是以秒计算的,你可以根据自己的理解,改成毫秒。///<summary>///延时函数///</summary>///<paramname="delayTime">需要延时多少秒</param>///<returns></returns>publicstaticboolDelay(intdelayTime){DateTimenow=DateTime.Now;ints;do{TimeSpanspand=DateTime.Now-now;s=spand.Seconds;Application.DoEvents();}while(s<delayTime);returntrue;}

解决方案十四:
使用定时器,或delay,sleep会阻塞线程

时间: 2024-11-05 06:06:20

button的显示问题的相关文章

自定义的cell中,button不显示图片文字 求大神告诉我下

问题描述 自定义的cell中,button不显示图片文字 求大神告诉我下 这是自定义的cell - (UIButton *)categoryBtn{ if (!_categoryBtn) { _categoryBtn = [[UIButton alloc]init]; _categoryBtn.backgroundColor = [UIColor yellowColor]; _categoryBtn.titleLabel.text = @""111111""; [_

c++-win8 store app开发中如何通过点击一个Button从而显示一张图片

问题描述 win8 store app开发中如何通过点击一个Button从而显示一张图片 开发语言是c++ 结合XAML写UI 原来设想是通过click改变Image的Visiblity属性的值,但发现行不通. 求助

界面更新 listview-Handler里面不能更新界面 包括List和Button的显示 求大神解答

问题描述 Handler里面不能更新界面 包括List和Button的显示 求大神解答 首先设置的是Activity的OnCrate方法 public class CreateActivity extends Activity{ protected static CharSequence text = "Waiting Range"; public static MobilocMaster mobilocMaster = new MobilocMaster(); public stat

打开pythoncard点击组件component中的Button后显示这个是什么意思。

问题描述 打开pythoncard点击组件component中的Button后显示这个是什么意思. 新手刚学.求轻拍 打开pythoncard点击组件component中的Button后显示这个是什么意思. 解决方案 程序出错了,不知道不是它自身的bug

新手求教:怎么实现Repeater里Button的显示与隐藏

问题描述 本人新手,求教各位高手,当点击登录后,怎么实现如果是管理员登录,Repeater里的Button按钮为显示,当是普通用户的时候Repeater里的Button按钮为隐藏?? 解决方案 解决方案二:可以直接在aspx页面中判断,或者后台repeater的itemdatabound事件中判断也行解决方案三:itemdatabound解决方案四:最好是把管理员登录的页面和普通用户登录的页面分开解决方案五:if(!管理员){bt.Visiable=false;} 解决方案六:1L+2L+4L将

androidTheme不显示button问题

问题描述 androidTheme不显示button问题 我在该活动中添加了这个主题,效果到是出来了,但是我这个登陆界面 是用的viewPager,滑到第四张的时候会出现一个button,但自从加了这个主题之后,button出不来了.后来,我在activity中加入了 // getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , // WindowManager.LayoutParams. FLAG_FULLSCREE

ontouchevent-android架子鼓怎么实现同时点击多个button同时响应操作的方法?

问题描述 android架子鼓怎么实现同时点击多个button同时响应操作的方法? 本人很爱玩音乐 看到ios平台很多音乐的模拟软件 吉他的~贝斯的 鼓的~~但是android平台却相当不给力 这些软件都很渣~~排名靠前的架子鼓的软件 竟然只能支持单指操作!就比如一个节奏咚次大次吧 kit(地鼓)和snare(踩镲)必须同时响起来 如果只支持单指操作的话 不能同时点击两个以上的鼓 这样模拟架子鼓的效果就太差了!! . . . 出于严重不满android平台音乐类软件质量的差劲 我就想自己捣鼓一个

jquery简单的div显示和隐藏特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

jquery之超简单的div显示和隐藏特效demo

本篇文章是对jquery中的div显示和隐藏特效demo进行了详细的分析介绍,需要的朋友可以参考下   复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/