惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - 叶小钗
The Cloudflare Blog
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
小众软件
小众软件
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享

博客园 - 骑牛射雕

Visual Studio 安装 旧版本(.NET Framework 4.0 和 4.5) 安装程序提示SWbemObjectSet:无效类处理方案 VSTO开发入门,CustomUI元素详解 线程池ThreadPool wpf combobox 绑定枚举 c# 相同类 赋值 WPF 使用Path绘制几何图形 Prism简介 WPF使用PATH来画圆 非对称加密 inno setup 安装前判断进程是否存在,以及停止相应进程 Inno Setup打包CreateProcess 740出错 C#委托与事件应用场景 X.509数字证书的结构与解析 C#action和func的使用 Oracle 分析函数(10G)语法详解 纯JS写的无刷新实时同步购物车系统 图片延时加载插件(lazyload) 几种调用WebService的方法
经过指定的时间后自动关闭的模式窗体
骑牛射雕 · 2021-10-14 · via 博客园 - 骑牛射雕

在开发单线图排版算法演示功能时,需要每执行一步排版过程,调整了电力设备的位置后就暂停一下,笔者第一个想到的方法就是让主线程暂停

代码如下:

private void showlayout_delay(double p_second)
        {
            DateTime now = DateTime.Now;
            while (now.AddSeconds(p_second) > DateTime.Now)
            {
            }
            return;
        }

System.Threading.Thread.Sleep(p_waitMilliSecond);

上面的方法虽然让程序暂停下来,但是却存在一个问题:无论排版过程运行了多少步,程序的图形状态始终和初始时一样,不会变化

即使使用Invalidate、refresh方法强制刷新整个屏幕

最终使了个小聪明解决了该问题:制作一个经过指定的时间后自动关闭的模式窗体

代码如下

public partial class FormDialogAutoClose : Form
    {
        private Thread waitThread;
        public FormDialogAutoClose(int p_waitMilliSecond)
        {
            InitializeComponent();
            waitThread = new Thread(new ThreadStart(delegate()
            {
                System.Threading.Thread.Sleep(p_waitMilliSecond);
                this.closeByThread();
                waitThread.Abort();
            }));
            waitThread.Start();

        }
        private delegate void closeByThreadHandler();
        public void closeByThread()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new closeByThreadHandler(closeByThread));
            }
            else
            {
                this.Close();
            }
        }
    }

调用代码

FormDialogAutoClose t_formClose = new FormDialogAutoClose(暂停时间);
 t_formClose.ShowDialog();

同时为了“掩人耳目”,将该模式窗体的Visible属性设置为false