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#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
随机推荐
- nmap命令-----基础用法
系统漏洞扫描之王-nmap NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工具包. 其基本功能有三个: (1)是扫描主机端口,嗅探所提供的网络服务 (2)是探测一 ...
- JMS - 事务性消息
JMS 事务遵从发送操作与接收操作相互分离的约定.下图显示的是一个事务性发送,其中一组消息要么能够保证全部到达消息服务器,要么连一条消息也不能保证到达消息服务器.从发送者的角度来看,JMS 提供者为这 ...
- 【转载】常用Maven插件介绍
http://www.cnblogs.com/crazy-fox/archive/2012/02/09/2343722.html 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构 ...
- html5 canvas 圆形抽奖的实例
年底没啥,抽空学习了canvas,写了个html5抽奖的代码,造了个轮子,有用的童鞋可以拿走. 其中,canvas.onclick触发抽奖行为,概率可以在core.lottery()函数上添加,美化也 ...
- 控制GridView中字段的长度,规范数据
前台: <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridVi ...
- Java 读写XML文件 API--org.dom4j
om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...
- 打开shpfile,mdb,sde工作空间
打开shapefile工作空间: ESRI.ArcGIS.Geodatabase.IWorkspaceFactory wsf = new ESRI.ArcGIS.DataSourcesFile.Sha ...
- 关于内存的5个函数(malloc,VirtualAlloc,GlobalAlloc,LocalAlloc,HeapAlloc)
VirtualAlloc 该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0 一次分配 1PAGE 以上的 R ...
- DEDECMS中,引入文件
引入文件:dede:include 标签:{dede:include filename="foot.htm"/}
- 隐藏win7盘符
1.隐藏盘符: //新建注册表,隐藏X盘符 int regeditme() { HKEY hkey; DWORD dwLastError= ;//隐藏X盘2^25 J:2^9=512 X:盘符与挂载的 ...