AnimateWindow 阻塞当前线程问题
今天查了蛮多的,虽然不是系统的学习,收获也不小。下面说一下我的解决方法:
问题一:采用 AnimateWindow API实现消息窗体FormMsg的动画出现,但由于该方法会阻塞当前线程,造成其他窗体(主窗体FormMain)的界面假死现象。
解决思路:既然这个动画效果会阻塞当前线程,那我新建一个线程去显示这个窗体不就行了,于是我写下如下代码:
Thread t = new Thread(new ThreadStart(ShowForm));
t.Start(); void ShowForm()
{
FormMsg fm = new FormMsg();
fm.Show();
}
结果消息窗体果然是不卡了,但新的问题又出现了,就是消息窗体出来动画一完马上就消失了,原因可想而知是因为新建的线程方法体执行完了之后就自动over了,窗体自然也就被回收了
解决思路2:后来想到下午查问题的时候了解到这个方法 Application.DoEvents(); 该方法的作用是让当前线程休息下,给界面上的操作一个反应的机会。想到这里我又萌生了解决第二个问题的方法,代码如下:
Thread t = new Thread(new ThreadStart(ShowForm));
t.Start(); void ShowForm()
{
FormMsg fm = new FormMsg();
fm.Show();
while (fm.Visible)
{
Application.DoEvents();
}
}
正如我设想的那样,新建的线程一直等我把消息窗体关闭呢,虽然用了无限循环有点损耗资源,但毕竟也算达到了效果
虽然效果达到了,本来做好的点击消息框里的条目直接跳转到对应业务操作界面时却又出现了一个常见的问题: 从不是创建控件“enjoyor_TabPageHead1”的线程访问它,意思就是消息窗体的控制线程无法直接访问主UI线程里面的控件
解决思路3:,这个好解决,使用 this.Invoke() 就可以了
如果有更好的方案,还请路过的大虾不吝指点!
百度到的资料:
http://www.360doc.com/content/10/1119/20/963301_70775588.shtml 深入探讨MFC消息循环和消息埲
http://www.myexception.cn/c-sharp/919109_2.html 窗体里怎么开二个UI线程
http://blog.sina.com.cn/s/blog_5459c700010004y1.html C#中如何判断线程结束
http://www.2cto.com/kf/201112/113681.html c#线程从陌生熟悉
http://hi.baidu.com/dragonnet/item/2627463b195836f7a98428e8 c#线程状态
http://bbs.csdn.net/topics/80058324 c#线程如何释放
AnimateWindow 阻塞当前线程问题的更多相关文章
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- Qt中运行后台线程不阻塞UI线程的方案
有一个想法,一个客户端,有GUI界面的同时也要向网络服务器发送本地采集的数据,通过网络发送数据的接口是同步阻塞的,需要等待服务器响应数据. 如果不采用后台线程的方案,用主UI线程关联一个定时器QTim ...
- 关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结
关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR. 根据网上解决的说法,分析源码: if (mFirstLayout) { // We don ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死
原文地址:https://www.cnblogs.com/wangchuang/archive/2013/02/20/2918858.html .c# Invoke和BeginInvoke 区别 Co ...
- Kafka producer异步发送在某些情况会阻塞主线程,使用时候慎重
最近发现一个Kafka producer异步发送在某些情况会阻塞主线程,后来在排查解决问题过程中发现这可以算是Kafka的一个说明不恰当的地方. 问题说明 在很多场景下我们会使用异步方式来发送Kafk ...
- 在什么情况下,不写notify()或者notifyAll()就能唤醒被wait()阻塞的线程?
之前再看java关于线程的某视频时,发现在JDK源码中,join()=join(0)=wait()=wait(0),但是视频中在join()了之后,并没有用notify()或者notifyAll()去 ...
- Java 中你怎样唤醒一个阻塞的线程?
在 Java 发展史上曾经使用 suspend().resume()方法对于线程进行阻塞唤醒,但 随之出现很多问题,比较典型的还是死锁问题. 解决方案可以使用以对象为目标的阻塞,即利用 Object ...
- GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
随机推荐
- hihocoder 1043 完全背包
#1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...
- java的回忆录
封装的三步骤:(1)加属性(成员变量.全局变量.域field)用private来修饰(2)为对应的属性生成共有的setter.getter方法(3)在对应的setter的方法中可以根据需要加入对应的验 ...
- Jquery 全选、反选问题解析
最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码: <div id="list"> < ...
- Nginx环境下配置PHP使用的SSL认证(https)
最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说c ...
- Fragment 整个生命周期
时间 2014-05-21 17:09:53 CSDN博客原文 http://blog.csdn.net/linfeng24/article/details/26491407 Fragment 生 ...
- 常用的sql标准建表语句
使用指定数据库 use v4base 建一张表 /*************************************************************************** ...
- SQL自动补充其他月份为0
,) ), Sales int,Dates datetime) insert into ProductSale ,'2014-01-05' UNION ALL ,'2014-02-05' UNION ...
- 免费主机kilu使用
我也是看了这篇文章:http://www.cnblogs.com/tenny/archive/2011/03/30/1999957.html 采取申请注册. 主机申请地址:http://www.kil ...
- Oracle中NVARCHAR2字符集不匹配问题
Oracle中在做字符匹配时 遇到 NVARCHAR2 类型时报错,提示 字符集不匹配. 对使用 NVARCHAR2 的地方,需要对字段进行字符转换,加上 to_char(nvarchar2 字段) ...
- 第一篇、jQuery的使用
1.jquery 的优势 >轻量级 >强大的选择器 >出色的DOM操作封装 >完善的事件和事件对象的兼容机制 >完善的ajax >不污染全局变量($可以随时交出控制 ...