ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

win 窗体 按钮 .Enabled:=false 中间做很多事情 还是会触发clik事件思考

2022-06-28 18:03:38  阅读:170  来源: 互联网

标签:ProcessMessages false win Enabled application 循环 按钮


本人是delphi ,

btnStart.Enabled:=false;

 之间做一个递归比较耗时,

btnStart.Enabled:=true;

发现在Enabled:=false; 之后还是会触发用户重复clik,诧异了。 百度了一下,发现 C# winform也是有这个问题,同一套机制。百度到下方文章,

避免用户重复点击按钮(使用Enable:=False,消息繁忙时会有堵塞的问题,只能改用Sleep) - findumars - 博客园
https://www.cnblogs.com/findumars/p/6347945.html

// 现象描述:
//    用户点击按钮后程序开始繁忙工作,这时候用户不知道是否成功,就继续点几次
//    采用Enalbe = false ... = true的方式发现还会触发点击,分析原因如下
// 当程序繁忙的时候消息被堵住了
// 所以点击消息还会被处理
// 将队列里的消息处理掉后才打开按钮的Enabled

private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    Thread.Sleep(2000);
    richTextBox1.AppendText(Environment.TickCount.ToString() + "/r/n");
    Application.DoEvents(); // 关键语句
    button1.Enabled = true;
}

而我改成: 就可以了。

procedure TForm1.btnStartClick(Sender: TObject);
begin
  btnStart.Enabled:=false;
  ErgodicDirectory('');//递归去做的比较耗时的事情
  Application.ProcessMessages();
  btnStart.Enabled:=true;//在恢复之前 用Application.ProcessMessages();
end;

 

application.ProcessMessages的主要作用使程序在循环时能够相应外界事件。
一般情况下,程序在循环的时候不响应外界事件。直到循环结束为止才能接受和响应外界事件。
application.ProcessMessages可以有效的解决循环循环的独占问题,能够暂时中断应用程序的执行。
比如,你要设计一个计算,这个计算需要循环10000次。当循环开始到500次的时候,用户突然不想计算下去了,它想取消这个计算,
这时候你就可以设置一个cancel按钮,然后在循环体内部合适的位置application.ProcessMessages。来处理cancel按钮的信息,中断循环。
如果你在循环体内没有application.ProcessMessages这句。当循环开始后,程序就被10000次的这个循环独占了,直到循环结束为止。在循环的期间,用户的按什么按钮都没有用。

平时也是常用 application.ProcessMessages 来 防止程序假死。想不到这里也需要用到它。

 

标签:ProcessMessages,false,win,Enabled,application,循环,按钮
来源: https://www.cnblogs.com/rogge7/p/16420483.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有