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

推荐订阅源

IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
L
LangChain Blog
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
P
Proofpoint News Feed
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
I
InfoQ
月光博客
月光博客
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
D
Docker
B
Blog

博客园 - 骑牛射雕

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